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
» Logiciel de planétarium.
MAXI-NOMBRES Emptypar Pedro Aujourd'hui à 8:08

» Un autre pense-bête...
MAXI-NOMBRES Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
MAXI-NOMBRES Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
MAXI-NOMBRES Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
MAXI-NOMBRES Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
MAXI-NOMBRES Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
MAXI-NOMBRES Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
MAXI-NOMBRES Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
MAXI-NOMBRES Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
MAXI-NOMBRES Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
MAXI-NOMBRES Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
MAXI-NOMBRES Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
MAXI-NOMBRES Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
MAXI-NOMBRES Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
MAXI-NOMBRES Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
-29%
Le deal à ne pas rater :
DYSON V8 Origin – Aspirateur balai sans fil
269.99 € 379.99 €
Voir le deal

 

 MAXI-NOMBRES

Aller en bas 
AuteurMessage
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MAXI-NOMBRES Empty
MessageSujet: MAXI-NOMBRES   MAXI-NOMBRES EmptyMar 9 Avr 2013 - 15:45

Salut tout le monde.
Votre ordinateur peut calculer les 4 opérations élémentaires de l’arithmétique : addition, soustraction, multiplication et division sur des entiers. (Monsieur de La Palisse ne peut dire mieux !)
Mais (et ceci n’est pas une Lapalissade) il peut manipuler des entiers plus grands que le nombre des toutes les particules contenues dans tout l’univers et même dans tout le multivers !
Il suffit de lui apprendre comment s’y prendre.

Le code suivant, en PANORAMIC pur (sans DLL) qui contient les procédures de calcul nécessaires, est là pour illustrer la méthode utilisée.
Vous pouvez intégrer dans vos programmes les procédures de calcul pour en faire un programme plus spécialisé.
Code:
' ******************************************************************************
'            MAXI-NOMBRES.BAS
'              PAR PAPYDALL
' ******************************************************************************
label fin
width 0,1200 : height 0,200
caption 0,"ARITHMETIQUE ELEMENTAIRE SUR LES MAXI-NOMBRES par Papydall"
button 1 : top 1,100  : left 1,200 : caption 1,"OK" : on_click 1,fin : inactive 1
Declaration_Variables()
' Affectation de 2 chaines pour contenir les 2 maxi-nombres
 n1$ = "98765432123456789123456789123456789987654321" : n2$ = "12345678987654321"
' n1$ = "000123" : n2$ = "0000001234" : ' Chaînes valides ; les zéros non significatifs sont éliminés
' n1$ = "0000" : n2$ = "00" : ' Chaînes valides ; les zéros non significatifs sont éliminés
' n1$ = "123.456" : n2$ = ""  : ' <--- Chaînes non valides : detectées par le programme
' n1$ = "+123" : n2$ = "-123" : ' <--- Chaînes non valides : detectées par le programme

' ==============================================================================
' REMARQUE :
' L'appel de la procédure Verif() c'est pour un éventuel utilisateur qui cherche
' à tout prix à coïncer le programme en fournissant des chaines de caractères
' contenant les nombres à traiter dont le contenu est fantaisiste !
' Pour tout utilisateur rationnel et responsable de ce qu'il fait, la ligne
' suivante peut être omise, sans regret
' ==============================================================================
Verif(n1$) : n1$ = result$ : Verif(n2$) : n2$ = result$
' ------------------------------------------------------------------------------
print : print
' Appels pour les différentes procédures de calcul
Addition(n1$,n2$)      : print n1$;" + ";n2$;" = ";result$
Soustraction(n1$,n2$)  : print n1$;" - ";n2$;" = ";result$
Multiplication(n1$,n2$) : print n1$;" * ";n2$;" = ";result$
Division(n1$,n2$)      : print n1$;" / ";n2$;" = ";quotient$;" Reste = ";reste$
active 1
end
' ******************************************************************************
fin:
terminate
return
' ******************************************************************************
' Déclaration des variables globales utilisées dans les procédures SUB
SUB Declaration_Variables()
    dim n% : n% = 99 : ' Nombre des chiffres des maxi-nombres (vous pouvez modifier cette valeur)
    dim a%(n%),b%(n%),c%(n%),c1%(n%),d%(n%),r%(n%)
    dim n1$,n2$,result$,quotient$,reste$
    dim flag% : flag% = 1
END_SUB
' ******************************************************************************

SUB Verif(a$)
    dim_local i% : result$ = "0"
' Vérifier que la chaîne n'est pas vide, sinon message et sortie
    if len(a$) < 1
      if message_error_ok ("!!! ERREUR ! Une chaîne vide!!!"+chr$(13)+"Vous vous foutez de ma gueule ou quoi ?")=1 then terminate
    end_if
' Vérifier que la chaîne ne contient que des chiffres, sinon message et sortie
    for i% = 1 to len(a$)
      if (numeric(mid$(a$,len(a$)+1-i%,1)) = 0) or  (mid$(a$,len(a$)+1-i%,1) = ".")
          if message_error_ok ("!!! ERREUR ! Verifiez vos nombres !!!"+chr$(13)+"!!! Seuls les chiffres sont acceptés !!!")=1 then terminate
      end_if
    next i%
' Spprimer les éventuels zéros non significatifs à gauche de la chaîne
    i% = 1
    while  mid$(a$,i%,1) = "0" : i% = i% + 1 : end_while
    if i% <= len(a$) then result$ = mid$(a$,i%,len(a$)-i%+1)

 END_SUB
' ******************************************************************************
SUB Init_tabl(a$)
    dim_local i%
' Remise à zéro de a%()
    for i% = 1 to n% : a%(i%) = 0 : next i%
' Initialisation de a%()
    for i% = 1 to len(a$) : a%(i%) = val(mid$(a$,len(a$)+1-i%,1)) : next i%
END_SUB
' ******************************************************************************
' Paramètres d'entrée les 2 maxi-nombres sous formes de string dans A$ et B$
' Résultat de retour de l'addition sous forme de string dans RESULT$
SUB Addition(a$,b$)
    dim_local i%
    Init_tabl(a$)
    for i% = 1 to n% : c%(i%) = a%(i%) : next i%
    Init_tabl(b$)
    for i% = 1 to n% : c1%(i%) = a%(i%) : next i%
    Add()
    for i% = 1 to n% : a%(i%) = c%(i%) : next i%
    Transcode()
END_SUB
' ******************************************************************************
' Paramètres d'entrée les 2 maxi-nombres sous formes de string dans A$ et B$
' Résultat de retour de la soustraction sous forme de string dans RESULT$
SUB Soustraction(a$,b$)
    dim_local i%
' Vérifier si la soustraction donnerait un résultat négatif ( cas où b$ > a$)
    if len(a$) > len(b$)
      flag% = 1
    else
      if len(a$) < len(b$)
          flag% = -1
      else
          flag% = 1
          for i% = 1 to len(a$)
              if asc(mid$(a$,i%,1)) < asc(mid$(b$,i%,1)) then flag% = -1 : exit_for
          next i%
      end_if
    end_if
' -----------------------
    Init_tabl(a$)
    for i% = 1 to n% : r%(i%) = a%(i%) : next i%
    Init_tabl(b$)
    for i% = 1 to n% : c%(i%) = a%(i%) : next i%
    Sous(flag%)
    for i% = 1 to n% : a%(i%) = r%(i%) : next i%
    Transcode() : flag% = 1
END_SUB
' ******************************************************************************
' Paramètres d'entrée les 2 maxi-nombres sous formes de string dans A$ et B$
' Résultat de retour de la multiplication sous forme de string dans RESULT$
SUB Multiplication(a$,b$)
    dim_local i%
    Init_tabl(a$) : for i% = 1 to n% : b%(i%) = a%(i%) : next i%
    Init_tabl(b$) : Mult() : for i% = 1 to n% : a%(i%) = c%(i%) : next i%
    Transcode()
END_SUB
' ******************************************************************************
' Paramètres d'entrée les 2 maxi-nombres sous formes de string dans A$ et B$
' Résultats de retour de la division entière sous forme de string :
' Quotient dans RESULT$, Reste dans RESTE$
SUB Division(a$,b$)
    dim_local i%,valid% : valid% = 0
    for i% = 1 to len(b$)
        if mid$(b$,i%,1) <> "0" then valid% = 1 : exit_for
    next i%
' tester si division par zéro
    if valid% = 0
      quotient$ = "La division par zéro est non définie !!"
      reste$ = "???"
      exit_sub
    end_if
' ---------------------
    Init_tabl(a$) : for i% = 1 to n% : c%(i%) = a%(i%) : next i%
    Init_tabl(b$) :for i% = 1 to n% : b%(i%) = a%(i%) : next i%
    for i% = 1 to n% : a%(i%) = c%(i%) : next i%
    Div() : for i% = 1 to n% : a%(i%) = d%(i%) : next i%
    Transcode() : quotient$ = result$
    for i% = 1 to n% : a%(i%) = r%(i%) : next i%
    Transcode() : reste$ = result$
END_SUB

' ******************************************************************************
' Procédure d'addition : ajoute à c%() le contenu  de c1%()
SUB Add()
    dim_local i%,m%,r%
    r% = 0
    for i% = 1 to n%
        m% = c1%(i%) + c%(i%) + r% : r% = int(m% / 10) : c%(i%) = m% - 10 * r%
    next i%
END_SUB
' ******************************************************************************
' Procédure de soustraction : Retranche à r%() le contenu de c%()
SUB Sous()
    dim_local i%,m,r
    r = 0
    for i% = 1 to n%
        m = flag%*(r%(i%) - (c%(i%) + r)) : r = 0
        while m < 0 : m = m + 10 : r = r + 1*flag% : end_while
        r%(i%) = m
    next i%
END_SUB

' ******************************************************************************
' Procédure de multiplication : multiplie a%() par b%(), résultat dans c%()
SUB Mult()
    dim_local i%,i1%,j1%,im%,m%,r%
    for i% = 1 to n% :c%(i%) = 0 : next i%
    i% = n%
    while a%(i%) = 0
      if i% > 1 then i% = i% - 1 : else : exit_while
    end_while
    im% = i%
    for i1% = 1 to n%
        if b%(i1%) <> 0
          for i% = 1 to n% : c1%(i%) = 0 : next i%
          if im% > n%-i1% then im% = n% - i1%
          r% = 0
          for j1% = 1 to im%+1
              m% = a%(j1%) * b%(i1%) + r% : r% = int(m%/10)
              c1%(j1%+i1%-1) = m% - r% * 10
          next j1%
          Add()
        end_if
    next i1%
END_SUB
' *****************************************************************************
' Procédure de division entière : Divise a%() par b%()
' Quotient dans d%(), reste dans r%() : utilise c%() et c1%()
SUB Div()
    dim_local i%,im%,ia%,ib%,a,b,m,md,r,j1%
    for i% = 1 to n% : d%(i%) = 0 : r%(i%) = a%(i%) : next i%
    i% = n%
    while b%(i%) = 0
      if i% > 1 then i% = i% - 1 : else : exit_while
    end_while
    im% = i%
' Boucle sans fin pour éviter l'utilisation de GOTO
' La sortie de cette boucle est assurée par un test
    repeat
        i% = n%
        while b%(i%) = r%(i%)
          if i% > 1 then i% = i% - 1 : else : exit_while
        end_while
        if b%(i%) > r%(i%) then exit_sub : ' on sort de la boucle sans fin !
        ia% = n%
        while r%(ia%) = 0 and ia% > 1 : ia% = ia% - 1 : end_while
        ib% = n%
        while b%(ib%) = 0 and ib% > 1 : ib% = ib% - 1 : end_while
        a = r%(ia%) : b = b%(ib%)
        if b = 0 then exit_sub : ' on sort de la boucle sans fin !
        md = a/b
        repeat
            if md < 1 then a = a * 10 + r%(ia% - 1) : md = a/b : ia% = ia% - 1
            for i% = 1 to n% : c%(i%) = 0 : next i%
            r = 0
            for j1% = 1 to im% + 1
                m = int(md) * b%(j1%) + r : r = int(m/10) : c%(j1% + ia% -ib%) = m-r*10
            next j1%
            i% = n%
            while  c%(i%) = r%(i%)
              if i% > 1 then i% = i% - 1 : else : exit_while
            end_while
            if c%(i%) > r%(i%) then md = md - 1
        until c%(i%) <= r%(i%)
        Sous()
        ia% = ia% - ib% + 1
        for i% = 1 to n% : c%(i%) = d%(i%) : c1%(i%) = 0 : next i%
        c1%(ia%) = md : Add()
        for i% = 1 to n% : d%(i%) = c%(i%) : next i%
    until 1 = 2  : ' pour éviter le GOTO
END_SUB
   
' *****************************************************************************
' Procédure de transcodage de l'entier long contenu dans a%(), en la chaîne
' de caractères result$
SUB Transcode()
    dim_local i%,a$
    a$ = ""
    for i% = 1 to n% : a$ = str$(a%(i%)) + a$ : next i%
    i% = 0
    while mid$(a$,i%+1,1) = "0" : i% = i% + 1 : end_while
    a$ = right$(a$,len(a$) - i%) : if a$ = "" then a$ = "0"
    if flag% = -1 then result$ = "-" + a$ : else : result$ = a$
END_SUB
' ******************************************************************************
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
 
MAXI-NOMBRES
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Les nombres narcissiques (ou nombres d’Armstrong)
» Traceur de courbes représentatives des fonctions y = f(x)
» Nombres romains
» nombres aléatoires
» Sub et nombres réels ?

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: