Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Calculatrice 8 bits, complément à 2 Mer 23 Mar 2022 - 17:53 | |
| Bonjour à tous ! Voici une petite calculatrice destinée aux nombres entiers signés suivant la technique dite du complément à 2. Pour en savoir plus, je vous recommande cet article : lien Wikipédia. D’une étendue de 8 bits, elle permet la représentation en binaire et en hexadécimal des entiers signés de -128 à +127. Entièrement interactive entre les différents champs, toutes les données sont recalculées à chaque changement. - Code:
-
' calculatrice 8 bits : Les nombres signés, Complément à 2 ' Marc - Mars 2022 ' Programme écrit en langage Panoramic
dim texte$, n_hex$, n_bin$, n_dec$ dim bin_n%, dec_bin%, dec_n%, dec_signe$, signe% dim bit%, valeur%, valeurDecimale%, valeurHexa%
label binModif, changerSigne, decModifPlus, decModifMoins, hexModifPlus, hexModifMoins, redim
interfaceUtilisateur()
end
sub interfaceUtilisateur() width 0,width(0) - width_client(0) + 570 height 0,height(0) - height_client(0) + 310 left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 color 0,240,240,240 caption 0,"PANORAMIC" font_name 0,"Arial" font_size 0,10 on_resize 0,redim
container 1 top 1,15 left 1,20 width 1,530 height 1,275 color 1,240,240,240 command_target_is 1 caption 1," Les nombres entiers signés : Complément à 2 " ' créer zone de saisie binaire creerZoneBinaire(10,65,108) ' créer zone de saisie décimale creerZoneDecimale(40,290,108)
' créer zone de saisie hexadécimale creerZoneHexadecimale(70,415,108)
' légendes alpha 200 top 200,57 left 200,138 font_size 200,13 caption 200,"Binaire" alpha 201 top 201,57 left 201,309 font_size 201,13 caption 201,"Décimal" alpha 202 top 202,57 left 202,420 font_size 202,13 caption 202,"Hexa." alpha 203 top 203,172 left 203,100 font_color 203,0,0,120 texte$ = "Bit de poids fort = bit de signe :" + chr$(13) texte$ = texte$ + " 0 = nombre positif" + chr$(13) texte$ = texte$ + " 1 = nombre négatif" caption 203,texte$ ' flèche bit de poids fort picture 204 width 204,26 height 204,49 left 204,69 top 204,135 color 204,240,240,240 2d_target_is 204 2d_pen_color 0,0,120 2d_line 0,1,17,1 2d_line 8,1,8,46 2d_line 8,45,26,45 2d_line 25,45,21,41 2d_line 25,45,21,49 logoPanoramic(435,180) end_sub
sub creerZoneBinaire(n%,x%,y%) dim_local i%, e%, b% b% = 7 for i% = 0 to 7 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0" cursor_point n% on_click n%,binModif alpha n%+100 left n%+100, x% + e% + 8 top n%+100, y% - 17 width n%+100, 25 height n%+100, 25 font_name n%+100,"Courier" font_size n%+100,10 caption n%+100,b% n% = n% + 1 b% = b% - 1 e% = e% + 25 next i% end_sub
sub creerZoneDecimale(n%,x%,y%) dim_local i%, e% for i% = 0 to 3 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0"
if i% = 0 cursor_point n% dec_signe$ = "+" caption n%,dec_signe$ on_click n%,changerSigne end_if
if i% > 0 picture n%+100 left n%+100, x% + e% top n%+100, y% - 20 width n%+100, 25 height n%+100, 25 2d_target_is n%+100 2d_fill_color 240,240,240 color n%+100,240,240,240 font_name n%+100,"Courier" font_size n%+100,12 print_target_is n%+100 print_locate 8,3 print "+" cursor_point n%+100 on_click n%+100,decModifPlus picture n%+105 left n%+105, x% + e% top n%+105, y% + 20 width n%+105, 25 height n%+105, 25 2d_target_is n%+105 2d_fill_color 240,240,240 color n%+105,240,240,240 font_name n%+105,"Courier" font_size n%+105,12 print_target_is n%+105 print_locate 8,5 print "-" cursor_point n%+105 on_click n%+105,decModifMoins end_if n% = n% + 1 e% = e% + 25 next i% end_sub
sub creerZoneHexadecimale(n%,x%,y%) dim_local i%, e% for i% = 0 to 1 button n% left n%, x% + e% top n%, y% width n%, 25 height n%, 25 font_name n%,"Courier" font_size n%,13 font_bold n% caption n%,"0"
picture n%+100 left n%+100, x% + e% top n%+100, y% - 20 width n%+100, 25 height n%+100, 25 2d_target_is n%+100 2d_fill_color 240,240,240 color n%+100,240,240,240 font_name n%+100,"Courier" font_size n%+100,12 print_target_is n%+100 print_locate 8,3 print "+" cursor_point n%+100 on_click n%+100,hexModifPlus picture n%+105 left n%+105, x% + e% top n%+105, y% + 20 width n%+105, 25 height n%+105, 25 2d_target_is n%+105 2d_fill_color 240,240,240 color n%+105,240,240,240 font_name n%+105,"Courier" font_size n%+105,12 print_target_is n%+105 print_locate 8,5 print "-" cursor_point n%+105 on_click n%+105,hexModifMoins n% = n% + 1 e% = e% + 25 next i% end_sub
sub logoPanoramic(x%,y%) ' Logo Panoramic picture 220 parent 220,1 height 220,60 width 220,60 top 220,y% left 220,x% color 220,255,255,255 2d_target_is 220 ' dessin des cercles rouges 2d_fill_color 255,255,255 2d_pen_color 255,0,0 2d_pen_width 2 2d_circle 30,30,26 2d_circle 30,30,20 ' dessin du "P" en bleu 2d_pen_width 1 2d_pen_color 51,52,153 2d_fill_color 51,52,153 2d_rectangle 23,20,27,42 2d_line 19,20,37,20 2d_line 21,21,39,21 2d_line 32,22,40,22 2d_line 34,23,41,23 2d_rectangle 35,24,41,28 2d_line 34,28,41,28 2d_line 32,29,40,29 2d_line 27,30,39,30 2d_line 27,31,37,31 2d_line 21,40,29,40 2d_line 19,41,32,41 end_sub
binModif: if caption$(number_click) = "0" caption number_click,"1" else caption number_click,"0" end_if modif_bin() return
decModifPlus: select number_click case 141 valeur% = val(caption$(41)) valeur% = valeur% + 1 valeurDecimale% = (valeur% * 100) + (val(caption$(42))*10) + val(caption$(43)) if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 41,str$(valeur%) modif_dec()
case 142 valeur% = val(caption$(42)) valeur% = valeur% + 1 if valeur% > 9 valeur% = 9 end_if valeurDecimale% = (val(caption$(41))*100) + (valeur% * 10) + val(caption$(43)) if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 42,str$(valeur%) modif_dec()
case 143 valeur% = val(caption$(43)) valeur% = valeur% + 1 if valeur% > 9 valeur% = 9 end_if valeurDecimale% = (val(caption$(41))*100) + (val(caption$(42))*10) + valeur% if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 43,str$(valeur%) modif_dec() end_select return
decModifMoins: select number_click case 146 valeur% = val(caption$(41)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if valeurDecimale% = (valeur% * 100) + (val(caption$(42))*10) + val(caption$(43)) if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 41,str$(valeur%) modif_dec()
case 147 valeur% = val(caption$(42)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if valeurDecimale% = (val(caption$(41))*100) + (valeur% * 10) + val(caption$(43)) if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 42,str$(valeur%) modif_dec()
case 148 valeur% = val(caption$(43)) valeur% = valeur% - 1 if valeur% < 0 valeur% = 0 end_if valeurDecimale% = (val(caption$(41))*100) + (val(caption$(42))*10) + valeur% if caption$(40) = "+" if valeurDecimale% > 127 return end_if else if valeurDecimale% > 128 return end_if end_if caption 43,str$(valeur%) modif_dec() end_select return
hexModifPlus: select number_click case 170 valeurHexa% = hex(caption$(70)) valeurHexa% = valeurHexa% + 1 if valeurHexa% > 15 valeurHexa% = 15 end_if caption 70,hex$(valeurHexa%) modif_hex() case 171 valeurHexa% = hex(caption$(71)) valeurHexa% = valeurHexa% + 1 if valeurHexa% > 15 valeurHexa% = 15 end_if caption 71,hex$(valeurHexa%) modif_hex() end_select return
hexModifMoins: select number_click case 175 valeurHexa% = hex(caption$(70)) valeurHexa% = valeurHexa% - 1 if valeurHexa% < 0 valeurHexa% = 0 end_if caption 70,hex$(valeurHexa%) modif_hex() case 176 valeurHexa% = hex(caption$(71)) valeurHexa% = valeurHexa% - 1 if valeurHexa% < 0 valeurHexa% = 0 end_if caption 71,hex$(valeurHexa%) modif_hex() end_select return
changerSigne: if caption$(number_click) = "+" caption number_click,"-" dec_signe$ = "-" else if dec_n% < 128 caption number_click,"+" dec_signe$ = "+" end_if end_if modif_dec() return
sub modif_bin() ' conversion valeur binaire en format décimal signé dec_bin% = 0 for bit% = 0 to 7 if val(caption$(bit% + 10)) = 1 dec_bin% = dec_bin% + POWER(2,7-Bit%) end_if next bit% if bin_and(dec_bin%,128) = 128 :' si le bit de poids fort est à 1 dec_n% = dec_bin% - 1 :' soustraction de 1 dec_n% = bin_xor(dec_n%,255) :' inversion de tous les bits dec_signe$ = "-" else dec_n% = dec_bin% dec_signe$ = "+" end_if
' conversion valeur décimale en chaine avec complément de "0" en tête pour avoir 3 chiffres n_dec$ = str$(dec_n%) while len(n_dec$) < 3 n_dec$ = "0" + n_dec$ end_while
' affiche la nouvelle valeur décimale caption 40,dec_signe$ caption 41,left$(n_dec$,1) caption 42,mid$(n_dec$,2,1) caption 43,right$(n_dec$,1) ' conversion valeur décimale en hexa avec complement de "0" en tête pour avoir une longueur de 2 caractères n_hex$ = hex$(dec_bin%) while len(n_hex$) < 2 n_hex$ = "0" + n_hex$ end_while
' affiche la valeur décimale caption 70,left$(n_hex$,1) caption 71,right$(n_hex$,1) end_sub
sub modif_dec() dim_local tmp% ' lecture de la nouvelle valeur decimale dec_n% = val(caption$(41)+caption$(42)+caption$(43)) dec_signe$ = caption$(40)
' calcul valeur décimale représentant le nombre binaire if dec_signe$ = "-" :' si le nombre est négatif dec_bin% = bin_xor(dec_n%,255) :' inversion de tous les bits dec_bin% = dec_bin% + 1 : ' ajout de "1" if dec_bin% > 255 dec_bin% = dec_bin% - 256 :' effacement retenue en cas de dépassement des 8 bits significatifs end_if else dec_bin% = dec_n% end_if
' conversion valeur décimale du binaire en hexa avec ajout de "0" en tête pour obtenir une longueur de 2 caractères n_hex$ = hex$(dec_bin%) while len(n_hex$) < 2 n_hex$ = "0" + n_hex$ end_while ' affichage de la valeur hexadécimale caption 70,left$(n_hex$,1) caption 71,right$(n_hex$,1)
' conversion de la valeur decimale-binaire en notation binaire n_bin$ = "" tmp% = dec_bin% while tmp% > 0 if frac(tmp% / 2) = 0 n_bin$ = "0" + n_bin$ else n_bin$ = "1" + n_bin$ end_if tmp% = int(tmp% / 2) end_while
while len(n_bin$) < 8 n_bin$ = "0" + n_bin$ end_while
' affiche la valeur binaire for bit% = 0 to 7 caption 10+bit%,mid$(n_bin$,bit%+1,1) next bit% end_sub
sub modif_hex() dim_local tmp% ' lecture nouvelle valeur hexadécimale n_hex$ = caption$(70)+caption$(71) ' conversion de la valeur hexa en décimal-binaire dec_bin% = hex(n_hex$) ' conversion de la valeur decimale-binaire en notation binaire n_bin$ = "" tmp% = dec_bin% while tmp% > 0 if frac(tmp% / 2) = 0 n_bin$ = "0" + n_bin$ else n_bin$ = "1" + n_bin$ end_if tmp% = int(tmp% / 2) end_while
while len(n_bin$) < 8 n_bin$ = "0" + n_bin$ end_while
' affiche la valeur binaire pure for bit% = 0 to 7 caption 10+bit%,mid$(n_bin$,bit%+1,1) next bit%
' conversion valeur décimale en chaine avec complement de "0" en tête pour avoir 3 chiffres if bin_and(dec_bin%,128) = 128 :' si le bit de poids fort est à 1 dec_n% = dec_bin% - 1 :' soustraction de 1 dec_n% = bin_xor(dec_n%,255) :' inversion de tous les bits dec_signe$ = "-" else dec_n% = dec_bin% dec_signe$ = "+" end_if
' conversion valeur décimale en chaine avec complément de "0" en tête pour avoir 3 chiffres n_dec$ = str$(dec_n%) while len(n_dec$) < 3 n_dec$ = "0" + n_dec$ end_while
' affiche la nouvelle valeur décimale caption 40,dec_signe$ caption 41,left$(n_dec$,1) caption 42,mid$(n_dec$,2,1) caption 43,right$(n_dec$,1) end_sub
redim: width 0,width(0) - width_client(0) + 570 height 0,height(0) - height_client(0) + 310 return
| |
|