{
  Joachim Deckers
  Anlage zur 2. Staatsexamensarbeit / 28.5.96

  Lösungsvorschlag zur Aufgabe 7 im Abschnitt
  "7.3.5.3 Exkurs: Hamming-Codes"

}

program KodiereDekodiere;

uses    WinCRT, BitStr;

{$F+}

const   CodeTabelle : array [0..3] of string =
                      ('00000','01111','10110','11001');

function kodiere(ein: string): string;
var i: integer;
    k: string;

  function wert(s: string): integer; { Berechnet den Wert eines Bitstrings mit 2 Bits}
  begin
    wert := (ord(s[1])-ord('0'))*2 + (ord(s[2])-ord('0'))
  end;

begin
  k:='';
  if (length(ein) mod 2) = 1 then ein := ein + '0'; { ggf. auffüllen }
  for i:=1 to length(ein) div 2 do 
    k := k + CodeTabelle[ wert(Copy(ein,i*2-1,2)) ];
  kodiere := k
end;


function dekodiere(ein: string): string; 
var i: integer;
    d, codewort: string;

begin
  d:='';
  if (length(ein) mod 5)<>0 then
    writeln('Fehler: Die Länge des Eingabestrings ist falsch!')
  else begin
    for i:=1 to length(ein) div 5 do begin
      codewort := Copy(ein,(i-1)*5+1,5);
      if codewort=CodeTabelle[0] then d:=d+'00'
      else if codewort=CodeTabelle[1] then d:=d+'01'
      else if codewort=CodeTabelle[2] then d:=d+'10'
      else if codewort=CodeTabelle[3] then d:=d+'11'
    end
  end;
  dekodiere:=d
end;


begin
  teste(kodiere,dekodiere,false)
end.
