Sunteți pe pagina 1din 7

Teoria Transmisiunii Informaiei -Partea I-Indrumar de laborator-Anexa 7

1
ANEXA 7 Sursa programului demonstrativ pentru codarea ciclic
program codaredecodareciclica;
{********************************************************}
{genereza un cod ciclic corector de o eroare
}
{se folosesc fisierele:"sursa.dat" si "simbinfo.dat"
}
{********************************************************}
uses crt,tti;
const p1=50; k1=8; m1=6;n1=14;
label 1;
type sursa=array[1..p1] of string;
codinf=array[1..p1] of array[1..k1] of byte;
polgen=array[1..m1+1] of byte;
matgen=array[1..k1,1..n1+1] of byte;
cuvcodinf=array[1..k1] of byte;
cuvcod=array[1..n1] of byte;
var s:sursa;ci:codinf;
gen:matgen;d:cuvcodinf;cuvint:cuvcod;
p,k,m,n,j,i1,mm:integer;g:polgen;
reluare:char;a:string;r:char;
procedure codificare(n:integer;j:integer;m:integer);
{*******************************************************
-realizeaza codificarea binara a sursei de informatie;
*********************************************************}
var i,pivot:integer;
begin
pivot:=(n+m) div 2;
for i:=n to pivot do ci[i][j]:=0;
for i:=pivot +1 to m do ci[i][j]:=1;
if pivot>n then
begin
j:=j+1; k:=j; codificare(n,j,pivot);
codificare(pivot+1,j,m);
end;
end;{procedure codificare}
procedure afisaresursa;
{*****************************************************}
{ afiseaza simbolurile sursei discrete din vectorul s[i]
}
{ si codul informational asociat
}
{***************************************************}
var i,j:integer;
begin
gotoxy(3,3);
writeln('alfabetul sursei si simbolurile de informatie:');
for i:=1 to p do

Codul surs pentru codarea ciclic


2
begin
if i>9 then
begin
gotoxy(3,3+i); write('s[',i,']=',s[i],'
','c[',i,']=');
for j:=1 to k do write(ci[i][j]);
writeln;
end
else
begin
gotoxy(3,3+i); write('s[',i,']=',s[i],'
','c[',i,']=');
for j:=1 to k do write(ci[i][j]);
writeln;
end;
if i=20 then semnalizare;
end;
gotoxy(3,4+i); writeln('numarul simbolurilor
sursei=',p);
gotoxy(3,5+i); semnalizare;
end;{procedure afisaresursa}
procedure incarcaresursa;
{*******************************************************
-citeste de pe disc simbolurile sursei si codul
informational asociat
*******************************************************}
var i,j,a:integer; aux:string;
f:file of string;g:file of byte;
begin
assign(f,'ss.dat'); reset(f);
p:=filesize(f); close(f);
reset(f);
for i:=1 to p do read(f,s[i]); close(f);
assign(g,'simbinfo.dat');
reset(g);a:=filesize(g);close(g);
k:=a div p;reset(g);
for i:=1 to p do for j:=1 to k do read(g,ci[i][j]);
close(g);
end;{procedure incarcare sursa}
procedure crearesursa(var ci:codinf;var s:sursa);
{*******************************************************}
{se alcatuiesc fisierele "sursa.dat" si "simbinfo.dat" }
{*******************************************************}
var i,j:integer; raspuns:char;
f:file of string;g:file of byte;
begin
gotoxy(2,22);
write('Fisierul sursa exista ?(d/n)');readln(raspuns);
if raspuns='d' then
begin

3
Anexa 7
incarcaresursa; afisaresursa; exit;
end

ELSE
BEGIN
sterge(22,1); gotoxy(2,22);
write('numarul de elemente=');readln(p);
sterge(22,1); gotoxy(2,22);
writeln('introduceti elementele sursei');
END;
for i:=1 to p do
begin
sterge(23,0); gotoxy(2,23);
write('s[',i,']='); readln(s[i]);
end;
codificare(1,1,p);
afisaresursa;
gotoxy(3,15);
write('datele afisate se salveaza pe disc ?(d/n)');
raspuns:='n';
readln(raspuns);
if raspuns='d' then
begin
assign(f,'ss.dat'); reset(f);
for i:=1 to p do write(f,s[i]);
close(f);
assign(g,'simbinfo.dat');rewrite(g);
for i:=1 to p do
for j:=1 to k do write(g,ci[i][j]);
close(g);
end;
end;{procedure creare sursa}
procedure calculdimcod(k:integer;var m:integer;var
n:integer);
{*********************************************************
}
{ calculeaza numarul bitilor de control si lungimea
cuvintului de cod}
{k=bitii de inf.,m=nr. bitilor de ctrl.,n=lungimea
cuvintului de cod }
{********************************************************}
var
gata:boolean;
aux,i:integer;
begin
STERGE(3,17);
gotoxy(3,3);
writeln('numarul bitilor de informatie=',k);
gata:=false; m:=1;
while gata=false do
begin
aux:=1;
for i:=1 to m do aux:=aux*2;

Codul surs pentru codarea ciclic


4
if aux < m+k+1 then m:=m+1
else gata:=true;
end;
gotoxy(3,4);
writeln('numarul de simboluri de control m=',m);
n:=m+k; gotoxy(3,5);
writeln('lungimea cuvintului de cod n=',n);
gotoxy(3,7); semnalizare;
end;{procedure calculdimcod }

procedure defpolgen(var g:polgen);


{******************************************************}
{ defineste coeficientii polinomului generator
}
{******************************************************}
var i:integer;gata,raspuns:char;f:file of byte;
begin
sterge(3,17);
gata:='n';
while gata='n' do
begin
gotoxy(3,3);
writeln('precizati coeficientii polinomului generator:
1+g1*X+g2*X**2...X**m');
gotoxy(3,4);
writeln('--------------------------------------------');
gotoxy(3,5); writeln('g(0)=g(m)=1 implicit !');
g[1]:=1;g[m+1]:=1;
for i:=2 to m do
begin
gotoxy(3,5+i);
write('g[',i,']=');readln(g[i]);
end;
gotoxy(3,5+i+1);
writeln('--------------------------------------------');
gotoxy(3,7+i);
for i:=1 to m+1 do write('g[',i,']=',g[i]:2,' ');
writeln;
gotoxy(3,8+i);
write('datele introduse sint corecte ?(d/n)');
readln(gata);
end;
sterge(3,17);
gotoxy(3,3);
write('salvati polinomul generator pe disc ?(d/n)');
raspuns:='n';
readln(raspuns);
if raspuns='d' then
begin
assign(f,'polgen.dat');

5
Anexa 7
rewrite(f);
for i:=1 to m+1 do write(f,g[i]);
close(f);
end;
gotoxy(3,5);
writeln('-----------------------------------');
gotoxy(3,7);
semnalizare;
end;{procedure definire polinom generator}

procedure genmatgen(m,n:integer;g:polgen;var
gen:matgen);
{***************************************************}
{-genereaza elementele matricei generatoare G
}
{n=lungimea codului;m=gradul polinomului generator; }
{g=coef. polinomului generator;gen=mat.generatoare }
{-se scrie mat.gen. in fisierul 'matgen.dat'
}
{***************************************************}
var i,j,z:integer; gata:char;
f:file of byte;
begin
z:=1;K:=N-M;
for i:=1 to k do
begin
for j:=1 to z do gen[i,j]:=0;
for j:=z to m+z do gen[i,j]:=g[j-z+1];
for j:=z+m+1 to n do gen[i,j]:=0;
z:=z+1;
end;
sterge(3,17);gotoxy(3,3);
writeln('***********************************');
gotoxy(3,4); writeln('matricea generatoare G:');
gotoxy(3,5); writeln('---------------------------------');
gotoxy(3,6); writeln('-numarul de linii=',k);
gotoxy(3,7); writeln('-numarul de coloane=',n);
gotoxy(3,8); writeln('----------------------------------');
for i:=1 to k do
begin
gotoxy(3,9);
for j:=1 to n do write(gen[i,j]:3);
writeln;
end;
gotoxy(3,10); writeln('-----------------------------------');
gotoxy(3,11); write('salvati matricea generatoare
pe disc ?(d/n)');
readln(gata);
if gata='d' then
begin
assign(f,'matgen.dat'); rewrite(f);

Codul surs pentru codarea ciclic


6
for i:=1 to k do
for j:=1 to n do write(f,gen[i,j]);
close(f);
end;
gotoxy(3,12); writeln('-----------------------------------');
gotoxy(3,13); semnalizare;
end;{procedure generare matrice generatoare}
procedure cod(r,q:integer;var a:cuvcodinf;var
l:integer;var b:polgen);
var i:integer;
c:cuvcodinf;
begin
r:=r-1;q:=q-1;l:=m;
repeat
c[r-q+1]:=a[r+1]*b[q+1];
for i:=q+1 downto 1 do
a[i+r-q]:=a[i+r-q] xor (c[r-q+1]*b[i]);
repeat
r:=r-1;
until (a[r+1]<>0) or (r<q);
until r<q;
for i:=1 to l-q do if (c[i]>1) or (c[i]<0) then c[i]:=0;
end;
begin{p.p.}
a:='
--- LABORATOR TTI --codarea
ciclica ';
cadru(a);
1:
sterge(2,18);
crearesursa(ci,s);
calculdimcod(k,m,n);
defpolgen(g);
genmatgen(m,n,g,gen);
sterge(3,17);
gotoxy(3,3);
write('codurile obtinute pentru simboluri sint:');
for j:=1 to p do
begin
for i1:=1 to k do d[i1]:=ci[j][i1];
cod(k,m,d,mm,g);
for i1:=1 to mm+1 do cuvint[i1]:=d[i1];
{control}
for i1:=mm+1 to k+mm+1 do cuvint[i1]:=ci[j][i1];
{informatie}
gotoxy(3,3+j);
write(s[j],' ');
for i1:=1 to k+mm+1 do write(cuvint[i1]);
end;
sterge(22,0);
gotoxy(2,22);

7
Anexa 7
write('Doriti o noua rulare?(D/N)');
repeat
r:=UPCASE(readkey);
until r in ['D','N'];
if r='D' then goto 1;
end.{p.p.}

S-ar putea să vă placă și