Enseignement > Pascal > TD > Conversion de nombres  

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.