Vous êtes sur la page 1sur 3

Changement de base.

L'algorithme dcrit ci-dessous demande l'utilisateur un nombre N exprim dans la base Base et l'exprime dans la base
NewBase.
En clair, un nombre tel que 123, exprim en base 10 peut tre transform en son quivalent hexadcimal, binaire ou autre.

L'ordinateur calculant en base 10, la premire tche est de ramener N dans la base 10. Pour ce faire, nous allons exploiter le fait
que nous travaillons avec une numration de position, savoir qu'en base 10

12345 = 1 * 104 + 2 * 103 + 3 * 102 + 4 * 101 + 5 * 100

Chaque chiffre est donc multipli par la base leve la puissance adquate. Dans notre algorithme, c'est la fonction Base10 qui
se chargera de la transformation de N en base 10.
Le passage la base NewBase se fait de manire inverse en procdant des divisions successives du nombre exprim en base
10.
Mais un exemple rendra les choses plus claires.
Prenons 756 exprim en base 9 et que nous dsirons crire en base 8.
(1) Vrifions d'abord que le nombre 756 est un nombre "valide" dans la base 9. Pour ce faire, regardons si chaque chiffre est
"acceptable" pour cette base. En base 9, il y a 9 chiffres: 0, 1, 2, 3, 4, 5, 6, 7 et 8. Dans l'algorithme dcrit ci-dessous, c'est la
fonction Verifie qui se charge de cette vrification.
(2) Exprimons 756 en base 10:
7569 = 7 * 92 + 5 * 91 + 6 * 90 = (7 * 9 + 5) * 9 + 6 = 61810
et le passage la base 10 se fera par des multiplications/additions successives plutt qu'avec des exponentiations moins rapides
et moins prcises.
(3) La transformation en base 8 se fera par des divisions successives:
61810 = 2 + 8 * (5 + 8 * (1 + 8 * 1)) = 1 * 83 + 1 * 82 + 5 * 81 + 2 * 80 = 11528

chane: Chiffres, N
entier: Base, NBase

Fonction Verifie(St,Base) Vrifie si le nombre est valable


paramtre: St: chane
Base : entier
valeur: boolen

boolen: Verif
entier: i, Cpt

Cpt <-- 0
pour i de 1 |St| faire
si Pos(Sti, Chiffres) > Base alors Cpt <-- Cpt+1 Cpt compte le nombre de chiffres non valables
fsi
fpour
si Cpt>0 alors Verif <-- faux
sinon Verif <-- vrai
fsi
Rsultat (Verif)

Fonction Majuscules(St) Met le nombre en majuscules (intressant pour les bases suprieures 10)
paramtre: St: chane
valeur: chane

entier: i

pour i de 1 |St| faire


si (Sti > "a") et (Sti < "z") alors Sti <-- UpCase(Sti)UpCase est une fonction Pascal
fsi
fpour
Rsultat (St)
Fonction Base10(St, Base) Transforme le nombre en base 10
paramtre: St: chane
Base: entier
valeur: entier

entier: i, B10

B10 <-- 0
pour i de 1 |St| faire
B10 <-- B10 * Base + Pos(Sti,Chiffres) - 1
fpour
Rsultat(B10)

Fonction NewBase(N, Base) Transforme le nombre de base 10 en NewBase


paramtre: N, Base: entier
valeur: chane

entier i
chane: B

B <-- ""
tant que NOT (N = 0) faire
i <-- N mod Base
B <-- Chiffresi+1 + B
N <-- N \ Base
ftant
Rsultat(B)

Chiffres <-- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"


crire "Introduisez le nombre (0 pour arrter):"
lire N Le nombre est lu sous forme de chane (pour les bases > 10, on utilise les chiffres A, B, ...)
tant que NOT (N="0") faire
N <-- Majuscules(N)
crire "Dans quelle base est-il exprim: "
lire Base
si NOT Verifie(N,Base) alors crire "Le nombre n'est pas correct!"
sinon crire "Dans quelle base faut-il l'exprimer: "
lire NBase
crire N," en base ",Base, " = ", NewBase(Base10(N,Base),NBase), " en base ",NBase
fsi
crire "Introduisez le nombre (0 pour arrter): "
lire N
ftant

PROGRAM Chgt_Base;

VAR Chiffres, N : STRING;


Base, NBase : BYTE;

FUNCTION Verifie(St:STRING;Base:BYTE):BOOLEAN;
VAR i, Cpt : BYTE;
BEGIN
Cpt:=0;
FOR i:=1 TO LENGTH(St) DO
IF POS(St[i],Chiffres)>Base THEN INC(Cpt);
IF Cpt>0 THEN Verifie:=FALSE
ELSE Verifie:=TRUE
END;

FUNCTION Majuscules(St:STRING):STRING;
VAR i : BYTE;
BEGIN
FOR i:=1 TO LENGTH(St) DO
IF (St[i]>='a') AND (St[i]<='z') THEN St[i]:=UPCASE(St[i]);
Majuscules:=St
END;
FUNCTION Base10(St:STRING;Base:BYTE):LONGINT;
VAR i : BYTE;
B10 : LONGINT;
BEGIN
B10:=0;
FOR i:=1 TO LENGTH(St) DO
B10:=B10*Base+POS(St[i],Chiffres)-1;
Base10:=B10
END;

FUNCTION NewBase(N:LONGINT;Base:BYTE):STRING;
VAR i : BYTE;
B : STRING;
BEGIN
B:='';
WHILE NOT (N=0) DO
BEGIN
i:=N MOD Base;
B:=Chiffres[i+1]+B;
N:=N DIV Base
END;
NewBase:=B;
END;

BEGIN
Chiffres:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
WRITE('Introduisez le nombre (0 pour arrter):');
READLN(N);
WHILE NOT (N='0') DO
BEGIN
N:=Majuscules(N);
WRITE('Dans quelle base est-il exprim ');
READLN(Base);
IF NOT Verifie(N,Base) THEN WRITELN('Le nombre n''est pas correct!')
ELSE BEGIN
WRITE('Dans quelle base faut-il l''exprimer: ');
READLN(NBase);
WRITELN(N,' en base ',Base, ' = ', NewBase(Base10(N,Base),NBase), ' en base ',NBase);
END;
WRITE('Introduisez le nombre (0 pour arrter):');
READLN(N);
END;
END.

Page prcdente.

Page d'accueil.

Vous aimerez peut-être aussi