MATH_ChangeBase    [Arithmetique]

Par Micael Germann (Math4D v1)
Nouvelle recherche
Si (Faux)
   ` MATH_ChangeBase [Micaël Germann 25/07/2002]
   ` --------------------------------------------- 
   ` Cette fonction permet d'exprimer
   ` un nombre entier positif donné dans une autre base quelconque;
   ` Limitations:
   ` - les bases supérieures à 36 ne sont pas reconnues,
   `    faute de symbolique adéquate connue de l'auteur
   ` - les nombres sont exprimés en chaine de caractères,
   `    ce qui implique que leurs représentations ne doit pas
   `    excéder 255 caractères (limite actuelle de 4D);
   ` - Le nombre doit être inférieur à MaxLong
   ` --------------------------------------------- 
   ` Rappels mathématiques :
   ` Un nombre entier peut être exprimé dans n'importe quelle base;
   ` Dans la vie quotidienne, la base 10 est utilisée (notation décimale),
   ` en informatique il est fréquent de parler en base 16 (notation hexadécimale),
   ` voir en base 8 pour des anciens systèmes (notation octale);
   ` Les informations sont physiquement stockées en base 2 dans un ordinateur
   ` (notation binaire), mais il peut être parfois utile de coder un nombre dans
   ` une base supérieure, afin de diminuer la place prise par sa représentation;
   ` RAPPEL: il ne s'agit que de la représenatation du nombre, pas sa valeur
   ` qui elle reste inchangée;
   ` L'algorithme de conversion proposé ci-dessous travail en deux temps:
   ` 1- conversion du nombre en base 10 par élévation à la puissance
   `    de la base d'origine de chaque digit en fonction de son ordre;
   ` 2 - conversion dans la base de destination par modulo et division entière;
   ` ---------------------------------------------
   ` MATH_ChangeBase (ChaineNombre; BaseOrigine; BaseDestination) -> Chaine
   ` ChaineNombre (Alpha 255car) Nombre dont on veut une autre représentation
   ` BaseOrigine (Numérique) Base dans laquelle le nombre est exprimé
   ` BaseDestination (Numérique) Base dans laquelle on veut sa représentation
   ` Résultat (Chaine) Représentation
   ` ---------------------------------------------
   ` MATHERROR
   ` 0 -> Pas d'erreur
   ` -1 -> Au moins un car; de chaine nombre n'est pas compatible avec base origine
   ` -2 -> Une des bases n'est pas gérée (non comprise dans l'intervalle [2;36])
   ` -3 -> La chaine résultante dépasse 255 caractères
   ` -4 -> La valeur de Nombre en base 10 est supérieur ou égal à MaxLong
   ` ---------------------------------------------
   ` ATTENTION
   ` Pensez à utiliser une chaine suffisament longue pour le résultat
   ` 
Fin de si 

C_ENTIER LONG(MATHERROR)
C_ALPHA(255;$1)
C_ENTIER LONG($2;$3)
C_ALPHA(255;$0)
$0:=""

  ` Traitement des erreurs de base
Au cas ou 
 : (($2<2) | ($2>36) | ($3<2) | ($3>36))  ` les bases indiquées sont-elles supportées 
 MATHERROR:=-2
Sinon 
 MATHERROR:=0
Fin de cas 

  ` Algorithme
Si (MATHERROR=0)
 C_ALPHA(255;$Nbre;$NewBase)
 C_ALPHA(36;$Caract)
 C_ENTIER LONG($Origine;$Destination;$Base10)
 
 $Origine:=$2
 $Destination:=$3
 $Caract:="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
 $Nbre:=Majusc($1)  ` Les caractères du nombre sont-ils corrects 
 $OK:=Vrai
 Boucle ($t;1;Longueur($Nbre))  ` On boucle sur tous les caractères
  $pos:=Position($Nbre²$t³;$Caract)
  Si (($pos>$Origine) | ($pos=0))  ` Le caractère doit appatenir à la base d'origine
   $OK:=Faux  `Si ce n'est pas le cas, on le signale à l'algorithme de conversion
   $t:=256  ` et on sort de la boucle, inutile de vérifier plus loin
  Fin de si 
 Fin de boucle 
 
 Si ($OK)  ` Si la chaine est vérifiée, on convertit le nombre en base dix
  Si ($Origine#10)  ` Traitement conventionnel si la base d'origine # 10
   $Base10:=0
   Boucle ($t;1;Longueur($Nbre))  ` Conversion caractère par caractère
    $Base10:=($Base10*$Origine)+Position($Nbre²$t³;$Caract)-1
   Fin de boucle 
  Sinon 
   $Base10:=Num($Nbre)  ` Plus rapide si la donnée est déjà en base 10
  Fin de si 
  
  Si (($Base10>0) & ($Base10