FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Gestion d'un système client-serveur.
Calculatrice 8 bits, complément à 2 Emptypar Klaus Aujourd'hui à 0:24

» PANORAMIC V 1
Calculatrice 8 bits, complément à 2 Emptypar Marc Hier à 19:51

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Calculatrice 8 bits, complément à 2 Emptypar Froggy One Hier à 11:16

» @Jack
Calculatrice 8 bits, complément à 2 Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Calculatrice 8 bits, complément à 2 Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Calculatrice 8 bits, complément à 2 Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Calculatrice 8 bits, complément à 2 Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Calculatrice 8 bits, complément à 2 Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Calculatrice 8 bits, complément à 2 Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Calculatrice 8 bits, complément à 2 Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Dessine-moi une galaxie
Calculatrice 8 bits, complément à 2 Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Calculatrice 8 bits, complément à 2 Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Calculatrice 8 bits, complément à 2 Emptypar papydall Dim 21 Avr 2024 - 23:30

» 2D_fill_color(résolu)
Calculatrice 8 bits, complément à 2 Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
Calculatrice 8 bits, complément à 2 Emptypar leclode Mer 17 Avr 2024 - 11:07

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-39%
Le deal à ne pas rater :
Ordinateur portable ASUS Chromebook Vibe CX34 Flip
399 € 649 €
Voir le deal

 

 Calculatrice 8 bits, complément à 2

Aller en bas 
AuteurMessage
Marc

Marc


Nombre de messages : 2389
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Calculatrice 8 bits, complément à 2 Empty
MessageSujet: Calculatrice 8 bits, complément à 2   Calculatrice 8 bits, complément à 2 EmptyMer 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.

Calculatrice 8 bits, complément à 2 Calca210

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
Revenir en haut Aller en bas
 
Calculatrice 8 bits, complément à 2
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» AND OR XOR : calculatrice 8 bits
» Calculatrice
» renommer une variable?
» Calculatrice spéciale
» V2.71 du 06/01/2014 - complément de fonctions

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: