/****************************************************************************/ // // // +----------------------+ // // | BASE CONVERTER V 2.0 | // // +----------------------+ // // // // Permet de convertir un nombre d'une base quelconque en un nombre de la // // base désirée. A été fait pour les cours de SPE Maths. // // // // compilé avec tigcc. // // command line : tigcc -O2 chgbase.c // // // // Par Stanowski Etienne alias IronMan // // Si vous avez des commentaires : Stan.Etienne@caramail.com // // Date : 18:56 20/10/2000 // // // /****************************************************************************/ * Pourquoi le mode nostub : --------------------------- le mode nostub est préférable au mode Doors, tout d'abord parce que le code est beaucoup plus petit, peu être utilisé sans avoir installé de kernel (comme une fonction du CAS) et enfin, les méssages d'erreur ne s'affichent pas en mode Doors. Néanmoins, vous êtes autorisés à le compiler en mode Doors si vous le voulez (à vos risques et périls : il n'a pas été testé!), vous devrez alors impérativemt ajouter cette ligne : char _comment[] = "Base Converter V 1.0 par Stanowki Etienne"; * Principe d'un changement de base : ------------------------------------ Les nombres utilisés communément en Maths sont de base 10 (une convention puisque les Maths sont totalement abstraits). Base 10 veut dire qu'un nombre peut être formé de 10 chiffres : 0,1,2,3,4,5,6,7,8 et 9. De même en informatique, on utilise des nombres binaires (de base 2) composés de 2 chiffres 0 et 1; et hexadécimaux (de base 16) composés de 16 chiffres : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E et F. Mais il est possible de convertir des nombres de base 10 en base 2, de base 10 en base 16, de base 2 en base 16, et inversement. De même, il existe une infinitée de bases; le but de ce programme est de convertir un nombre d'une base quelconque en un nombre d'une base choisie. (l'algorithme est assez facile à comprendre mais comme c'est moi qui l'est réalisé il en existe surement de plus éfficaces). Un changement de base avec des nombres négatifs existe uniquement en informatique. Ce mode de conversion m'est connu uniquement pour les nombres binaires et héxadécimaux, je ne sais pas s'il existe pour d'autres base. La conversion néanmoins fonctionne pour toutes les bases, le réultats est donné sur le même principe que pour les nombres binaires et héxadécimaux. * Utiliser le programme : ------------------------- Le code a été optimisé pour prendre le moins de place possible sur la Ti donc le calcul ou les vérifications d'erreur pourraient être un peu plus rapide mais de toute façon ça ne se verrait pas puisque une conversion est instantannée pour n'importe quel nombre et base. Le programme est limité a 36 bases à cause du nombre de lettres et chiffres existants : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' (inutile d'ajouter des pauvres lettres comme les lettres grecs ou autres..., néanmoins vous pouvez le faire pour votre utilisation PERSONNELLE en le recompilant avec plus de lettres). chgbase(A,B,"String") où A et B sont des nombres entiers naturels compris entre 2 et 36, String le nombre de base A qui doit être converti en base B. String doit être entré sous forme de String (chaine de caractères). Le résultat est donné sous la forme d'une chaine de caractères. Exemples : * pour les conversions normales : - chgbase(31,18,"salut") -> "DF6B34" 'salut' est un nombre de base 31 et 'DF6B34' de base 18. Le programme transforme automatiquement les minuscules en majuscules donc les 2 sont acceptés. - chgbase(32,10,"salut") -> "FD0685" 'salut' est un nombre de base 32 et 'FD0685' de base 18. On obtient pas le même résultat que dans l'exemple précédent parce 'salut' n'est plus de la même base! - chgbase(32,10,"000salut") -> "FD0685" le nbr de 0 est géré, et ne créer aucuns problèmes de convertions * Pour les conversions signées : les conversions signées sont prises en charge du moment que '+' ou '-' apparait au début du string. Sinon les conversions seront normales. En base 10, le resultat sera compris entre -(2^31-1) et 2^31-1. - chgbase(10,2,"-45") -> "+11111111111111111111111111010011" - chgbase(10,2,"+45") -> "+101101" - chgbase(10,10,"+2147483700") -> "-2147483596". Le nombre '+2147483700' est supérieur à 2^31-1, sa correspondance signée est '-2147483596'. - chgbase(2,10,"+11111111100001111101010101011010") -> "-7875238" * Limitation : -------------- Le nombre entré ne peut être supérieur à 2^32-1 quelle que soit sa base (ex : en base 15, on ne peut entrer un nombre supérieur à '1A20DCD80'). La limite sera repoussée à 2^64-1 quand les nombres long long seront gérés par TiGccLib ou TiGcc. De même la chaîne ne peut avoir plus de 32 caractères sans comter les 0 du début. * Bugs et erreurs : ------------------- Le programme détecte automatiquement les erreurs pouvant être commises afin d'éviter que la calculette plante, c'est d'ailleur pourquoi le code fait près de 1200 octets. Erreurs détectées : - Syntaxe : le nombre d'arguments est différent de 3 A n'est pas un entier relatif (positif) B n'est pas un entier relatif (positif) String n'est pas une chaine de caractères A n'est pas compris entre 2 et 36 B n'est pas compris entre 2 et 36 - Nombre ne correspond pas à la base A (ex : '101012' pour une base de 2) - Syntaxe du nombre incorrecte : un caractère autre qu'un chiffre ou une lettre à été entrée. - Nombre trop grand (voir limitation) Aucun bug connu. Toutes les conversions essayées marchent parfaitement et ont été vérifiées par le CAS de la calculatrice (pour les base 2 et 16) et par un petit programme informatique pour les autres bases : les résultats sont donc sûres! Si vous trouvez le moindre problème, contactez-moi : Stan.Etienne@caramail.com et donnez les circonstances qui ont fait apparaitre ce problème. Merci. Je ne pourrai en aucun cas être tenu responsable des dégats causés par ce programme sur votre calculette (aucune chance que ça arrive , ne vous inquiétez pas!) * Historique : -------------- Version : v 2.0 20/10/2000 Correction du bug sur rom 2.05, le programme fon- ctionne à présent sur toutes les roms 2.0x Nouveau : mode signé de conversion. taille : 1393 v 1.0 02/10/2000 Première version. L'algorithme fonctionne parfaite- ment. Aucun bug connu, erreurs gérées. Existe en 2 versions Française et Anglaise. Compilé avec TiGccLib v 2.2 taille : 1169 * Remerciements : ----------------- - merci à l'équipe de TiGcc pour leur formidable travail et explications. - à SigmaPhi pour l'avoir testé et un certain 'AA' pour m'avoir demandé d'ajouter un mode signé. - à moi pour l'avoir programmé (héhé!) - à vous pour l'avoir téléchargé : j'espère qu'il pourra vous aider. * License : ----------- Il s'agit d'un freeware. Vous êtes libre de le redistribuer à condition de joindre ce texte non modifié. Tous vos commentaires seront les bienvenus. envoyez les à : Stan.Etienne@caramail.com.