Conversion de nombres
Objectifs pédagogiques : manipulation de types, déclaration de constantes, tableau simple, création de fonctions, algorithmie.
Sujet :
Nous possédons 10 signes (car nous avons 10 doigts) pour écrire nos nombres, nous les appelons les chiffres (0, 1, 2, 3, 4, 5, 6, 7, 8 et 9). C'est pourquoi notre système de numération est appelé système décimal.
Le système décimal n'est pas toujours adapté : les bases 12 et 60 sont couramment utilisées ; les systèmes informatiques manipulent principalement les bases 2 et 16.
On cherche dans cet exercice à modéliser et à convertir des nombres dans d'autres bases que la base 10.
1. Proposer une structure de données TChiffre permettant de modéliser des chiffres dans des bases supérieures à 10
Ecrire les 2 fonctions réciproques suivantes, permettant de donner le chiffre associé à une valeur décimale
function Chiffre(valeur : integer):TChiffre;
function Valeur(chiffre:TChiffre):integer;
2. Proposer une structure de données TNombre permettant de modéliser un nombre dans une base quelconque utilisant les chiffres définis 1
Ecrire une fonction permttant d'initialiser un nombre à 0
function InitialiseNombre : TNombre;
3. Ecrire une fonction permettant de convertir un de ces nombres en chaîne de caractères (string) afin de permettre son affichage
function Nombre_ToString(nombre : TNombre): string;
4. Ecrire une fonction permettant de convertir un nombre décimal en un nombre dans une autre base
function ConversionEnNombre(decimal,base:integer):TNombre;
5. Ecrire la fonction inverse
function ConversionEnDecimal(nombre:TNombre;base:integer):integer;
6. Ecrire un programme permettant de tester ces fonctions
Corrigé
program PConversion;
type TChiffre = char;
CONST MAX_CHIFFRES_NOMBRE = 64;
//Un nombre dans une base quelconque sera un tableau de 64 caractères
type TNombre = array[1..MAX_CHIFFRES_NOMBRE] of TChiffre;
//qui sera écrit "à l'envers" de gauche à droite
// exemple 8 en base 2 (1000) sera représenté 0001
CONST CHIFFRE_FIN = chr(0); //on marque la fin du nombre par un caractère spécial
function Chiffre(valeur : integer):TChiffre; // donne le chiffre associé à un nombre décimal
begin // on utilise les chiffres décimaux 0..9
if valeur<10 // puis les lettres A B C ...
then chiffre := chr(valeur+ord('0')) // exemple 15 en décimal donne le chiffre F
else chiffre := chr(valeur-10+ord('A'));
end;
function Valeur(chiffre:TChiffre):integer; //donne la valeur décimal d'un chiffre quelconque
begin
if chiffre in ['0'..'9'] then Valeur := ord(chiffre)-ord('0')
else Valeur := ord(chiffre)+10-ord('A');
end;
function InitialiseNombre : TNombre; //intialise un nombre à zero
var nombre : TNombre;
begin
nombre[1]:=chiffre(0);
nombre[2]:=CHIFFRE_FIN; // on marque la fin du nombre avec un caractère spécial
InitialiseNombre := nombre;
end;
function Nombre_ToString(nombre : TNombre): string; //renvoie une chaine représentant le nombre
var i : integer;
s : string;
begin
s := '';
i := 1;
while ((i <= MAX_CHIFFRES_NOMBRE) and (nombre[i]<>CHIFFRE_FIN)) do
begin
s:=nombre[i]+s; // en concaténant ainsi la chaine, le nombre se trouve écrit de gauche à droite
i:=i+1;
end;
Nombre_ToString := s;
end;
function ConversionEnNombre(decimal,base:integer):TNombre;
var i : integer;
nombre : TNombre;
begin
nombre := InitialiseNombre; // on commence avec un nombre à zero
i:=1;
while (decimal >= base) and (i <= MAX_CHIFFRES_NOMBRE) do
begin
nombre[i]:= chiffre(decimal mod base); //on fait une série de division successives
decimal := decimal div base; // pour calculer chaque chiffre du nombre
i:=i+1;
end;
if (i > MAX_CHIFFRES_NOMBRE)
then writeln('Dépassement de capacité')
else begin
if decimal>0 then nombre[i]:= chiffre(decimal mod base);
nombre[i+1]:=CHIFFRE_FIN;
ConversionEnNombre := nombre;
end;
end;
function ConversionEnDecimal(nombre:TNombre;base:integer):integer;
var i,decimal,puissance : integer;
begin
decimal := 0;
i:=1;
puissance:=1;
while ((i <= MAX_CHIFFRES_NOMBRE) and (nombre[i]<>CHIFFRE_FIN)) do
begin
decimal := decimal+Valeur(nombre[i])*puissance;
i:=i+1;
puissance:=puissance*base;
end;
ConversionEnDecimal := decimal;
end;
var decimal,base : integer;
begin
write('Entrer un nombre decimal a convertir : ');readln(decimal);
write('Entrer la base de conversion : ');readln(base);
writeln(Nombre_ToString(ConversionEnNombre(decimal,base)));
writeln(ConversionEnDecimal(ConversionEnNombre(decimal,base),base));
readln;
end.