Changement de base.
L'ordinateur calculant en base 10, la première tâche est de ramener N
dans la base 10. Pour ce faire, nous allons exploiter le fait que nous
travaillons avec une numération de position, à savoir qu'en base 10
chaîne: Chiffres, N entier: Base, NBaseFonction Verifie(St,Base) Vérifie si le nombre est valable paramètre: St: chaîne Base : entier à valeur: booléen
booléen: 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 Résultat (Verif)
Fonction Majuscules(St) Met le nombre en majuscules (intéressant pour les bases supérieures à 10) paramètre: St: chaîne à valeur: chaîne
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 Résultat (St)
Fonction Base10(St, Base) Transforme le nombre en base 10 paramètre: St: chaîne Base: entier à valeur: entier
entier: i, B10
B10 <-- 0 pour i de 1 à |St| faire B10 <-- B10 * Base + Pos(Sti,Chiffres) - 1 fpour Résultat(B10)
Fonction NewBase(N, Base) Transforme le nombre de base 10 en NewBase paramètre: N, Base: entier à valeur: chaîne
entier i chaîne: B
B <-- "" tant que NOT (N = 0) faire i <-- N mod Base B <-- Chiffresi+1 + B N <-- N \ Base ftant Résultat(B)
Chiffres <-- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" écrire "Introduisez le nombre (0 pour arrêter):" lire N Le nombre est lu sous forme de chaîne (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 arrêter): " 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 arrêter):');
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 arrêter):');
READLN(N);
END;
END.