Le code Morse

 

En utilisant les techniques des arbres binaires, on peut facilement réaliser un programme qui représente graphiquement le code Morse par un arbre binaire. Dans cet arbre on considère seulement les lettres de A à Z, car leur représentation tient sur 5 niveaux. On rappelle que le code Morse est constitué de points et de tirets : ainsi le "S" est représente par 3 points "..." et le "O" par trois tirets "---". On considère que les points sont représentés par un fils gauche d'un noeud, et un tiret par un fils droit d'un noeud. Voici la représentation graphique d'un arbre contenant l'alphabet:

Nous devons réaliser le programme qui dessine cet arbre. On utilise une chaîne de caractères pour stocker les lettres. Il faut savoir que l'alphabet Morse a plus de caractères que ce que nous avons choisi, qui font qu'un arbre binaire descend  à sept niveaux. C'est pourquoi nous nous sommes limités seulement à  5 niveaux, et nous avons rempli les caractères manquants par des espaces.

Pour réaliser cet arbre, nous utilisons le parcours préfixe que nous avons vu précédemment et nous utilisons une formule mathématique afin d'introduire à chaque noeud de l'arbre le caractère correspondant.

La chaîne de caractères est donc, en fonction du parcours préfixe, la suivante :

const st : string = ' EISHVUF ARL WPJTNDBXKCYMGZQO  ';

Les structures de données utilisées sont les suivantes :

 

noeud = class
private
  carac: char;
  gauche, droite: noeud;
  constructor create(c: char);
  destructor destroy;
  procedure creer(nb, niv: integer);
  procedure afficher(x, y, l: integer);
end;
 
arbre = class
private
  tete, courant: noeud;
public
  constructor create(c: char);
  destructor destroy;
  procedure afficher(x, y, l: integer);
end;
 
 
constructor noeud.create(c: char);
begin
  carac := c;
  gauche := nil; droite := nil;
end;
 
destructor noeud.destroy;
begin
  if gauche <> nil then gauche.destroy;
  if droite <> nil then droite.destroy;
end;
 
procedure noeud.afficher(x, y, l: integer);
begin
  with form1.image1.picture.bitmap.canvas do
  begin
    ellipse(x, y, x + 25, y + 25);
    textOut(x + 5, y + 5, carac);
    if gauche <> nil then
    begin
      moveto(x + 3, y + 20); lineto(x - (l div 2) + 10, y + 70);
      gauche.afficher(x - (l div 2), y + 60, l div 2);
    end;
    if droite <> nil then
    begin
      moveto(x + 22, y + 20); lineto(x + (l div 2) + 10, y + 70);
      droite.afficher(x + (l div 2), y + 60, l div 2);
    end;
  end;
end;
 
procedure noeud.creer(nb, niv: integer);
var i: integer;
begin
  if niv < 5 then
  begin
    gauche := noeud.create(st[nb + 1]);
    gauche.creer(nb + 1, niv + 1);
    i := nb + (round(exp((5 - niv) * ln(2))));
    droite := noeud.create(st[i]);
    droite.creer(i, niv + 1);
  end;
end;
 
//--------------------------------------
 
constructor arbre.create(c: char);
begin
  tete := noeud.create(c);
  courant := tete;
end;
 
destructor arbre.destroy;
begin
  courant := nil;
  tete.destroy;
end;
 
procedure arbre.afficher(x, y, l: integer);
begin
  tete.afficher(x, y, l);
end;
 
//--------------------------------------
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  morse := nil;
  image1.picture.bitmap := tbitmap.create;
  with image1.picture.bitmap do
  begin
    width := 639; height := 500;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  morse := arbre.create(' ');
  morse.tete.creer(1, 1);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  morse.afficher(image1.width div 2 - 10, 10, image1.width div 2);
end;

 

Nous allons expliquer maintenant la création de l'arbre.

Le sommet contient un espace.

A gauche du sommet on a la lettre "E" et à droite la lettre "T", c'est à dire les positions 2 et 17 de notre chaîne de caractères "st". 2=1+1 et 17=1+16.

Au niveau suivant, à gauche du "E" on a "I" et à droite "A", c'est à dire les positions 3 et 10 de notre chaîne de caractères "st". Mais 3=2+1 et 10=2+8, où 2 est la position de "E" dans "st".

Au niveau suivant, à gauche de "I" on a "S" et à droite "U", c'est à dire les positions 4 et 7 de notre chaîne de caractères "st". Mais 4=3+1 et 7=3+4.

On constate donc que le fils gauche d'un noeud à la valeur du père incrémenté de 1 (on parle des caractères qui sont dans la chaîne "st" : "E"+1="I"; "I"+1="S") et que le fils droit à la valeur du père incrémenté de 25-niveau. On lit cela "2 élevé à la puissance (5-niveau)". On rappelle qu'ici le sommet de l'arbre est au niveau 1, donc la lettre "E" est au niveau 2; par conséquent, le fils droit de "E" sera incrémenté de 8, car 23=8. De même, le fils droit du sommet sera incrémenté de 16, car 25-1 = 24 = 16.

 

Télécharger le code source Delphi