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
» Philharmusique
MAXI-NOMBRES Emptypar jjn4 Aujourd'hui à 13:58

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
MAXI-NOMBRES Emptypar papydall Hier à 16:57

» PANORAMIC V 1
MAXI-NOMBRES Emptypar papydall Hier à 3:22

» select intégrés [résolu]
MAXI-NOMBRES Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
MAXI-NOMBRES Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
MAXI-NOMBRES Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
MAXI-NOMBRES Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
MAXI-NOMBRES Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0
MAXI-NOMBRES Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
MAXI-NOMBRES Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
MAXI-NOMBRES Emptypar Klaus Lun 6 Mai 2024 - 10:23

» @Jack
MAXI-NOMBRES Emptypar Jack Mar 30 Avr 2024 - 20:40

» Une calculatrice en une ligne de programme
MAXI-NOMBRES Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
MAXI-NOMBRES Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
MAXI-NOMBRES Emptypar jjn4 Ven 26 Avr 2024 - 17:39

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le deal à ne pas rater :
Cartes Pokémon 151 : où trouver le coffret Collection Alakazam-ex ?
Voir le deal

 

 MAXI-NOMBRES

Aller en bas 
AuteurMessage
papydall

papydall


Nombre de messages : 7008
Age : 73
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)
» Nb maxi de caractères dans une ligne
» Nombres romains
» NOMBRES PREMIERS
» Les nombres Shadocks

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: