| 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.
|