Всё то-же кодирование текста
Добавлено: 15 дек 2006, 00:41
Честное слово, я уже не знаю, в чём тут проблема, просто когда тестил, получается, что он не сравнивает элементы строк
Задание:
Зашифровать данный текст, записанный с помощью русских букв и знаков препинания, заменив каждую букву, на букву, отстоящую от неё на n букв. Сдвиг производить по кругу. Исходный и результирующие тексты поместить в файлы.
Проблема в процедуре кодирования....в декодировании всё по аналогии....
Функция R работает как часы, спасибо, что в прошлый раз по поводу неё сказали, она считывает строку из файла с номером pos
заранее спасибо
alp=33{кол-во букв}
Procedure Coding(NStr:integer);
var
mas,b_mas,mas1,b_mas1:string[66];
f:text;
str:string; {кодируемая строка}
pos:integer; {номер строки на которой остановились при кодировке}
N,k,i,j:integer;
M:integer; {число смещения}
begin
pos:=0;
writeln('Введите N');
readln(N);
if N<>0 then
begin
mas:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
b_mas:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
if N>32 then
M:=N-(N div alp)*alp
else
M:=N;
mas1:=mas;
b_mas1:=b_mas;
{сдвигаем буквы алфавита по кругу влево, например при М=1: абвг->бвга}
{--------------------------------------------------------------------}
for i:=1 to (alp-M) do
begin
mas1:=mas1[i+M];
b_mas1:=b_mas1[i+M];
end;
j:=1;
for i:=(alp-M+1) to alp do
begin
mas1:=mas[j];
b_mas1:=b_mas1[j];
j:=j+1;
end;
{--------------------------------------------------------------------}
writeln('Test :',mas1); {test}
readln;
if M=0 then
begin
writeln('Вы выбрали число, при котором будет происходить');
writeln(' круговое смещение и текст не будет закодирован');
readln;
end
else
{сравнивание посимвольно строк текста с несмещённым алфавитом,
при совпадении, текущему элементу присваивается символ из сме-
щенного алфавита}
{--------------------------------------------------------------------}
for i:=1 to NStr do
begin
str:=R(pos);
for j:=1 to length(str) do
begin
if (ord(str[j])>=128) and (ord(str[j])<=159) then
for k:=1 to alp do
if b_mas[k]=str[j] then
str[j]:=b_mas1[k];
if (ord(str[j])>=160) and (ord(str[j])<=175) and (k<>n)
or (ord(str[j])>=224) and (ord(str[j])<=239) and (k<>n) then
for k:=1 to alp do
if mas[k]=str[j] then
str[j]:=mas1[k];
end;
pos:=pos+1;
{$I-} {отключение контроля ошибок ввода\вывода}
assign(f,outp);
reset(f);
if IOResult<>0 then
rewrite(f)
else
append(f);
writeln(f,str);
close(f);
{$I+} {включение контроля ошибок ввода\вывода}
end;
end
else
begin
writeln('N=0, текст не будет закодирован');
readln;
end;
end;
Задание:
Зашифровать данный текст, записанный с помощью русских букв и знаков препинания, заменив каждую букву, на букву, отстоящую от неё на n букв. Сдвиг производить по кругу. Исходный и результирующие тексты поместить в файлы.
Проблема в процедуре кодирования....в декодировании всё по аналогии....
Функция R работает как часы, спасибо, что в прошлый раз по поводу неё сказали, она считывает строку из файла с номером pos
заранее спасибо
alp=33{кол-во букв}
Procedure Coding(NStr:integer);
var
mas,b_mas,mas1,b_mas1:string[66];
f:text;
str:string; {кодируемая строка}
pos:integer; {номер строки на которой остановились при кодировке}
N,k,i,j:integer;
M:integer; {число смещения}
begin
pos:=0;
writeln('Введите N');
readln(N);
if N<>0 then
begin
mas:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
b_mas:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
if N>32 then
M:=N-(N div alp)*alp
else
M:=N;
mas1:=mas;
b_mas1:=b_mas;
{сдвигаем буквы алфавита по кругу влево, например при М=1: абвг->бвга}
{--------------------------------------------------------------------}
for i:=1 to (alp-M) do
begin
mas1:=mas1[i+M];
b_mas1:=b_mas1[i+M];
end;
j:=1;
for i:=(alp-M+1) to alp do
begin
mas1:=mas[j];
b_mas1:=b_mas1[j];
j:=j+1;
end;
{--------------------------------------------------------------------}
writeln('Test :',mas1); {test}
readln;
if M=0 then
begin
writeln('Вы выбрали число, при котором будет происходить');
writeln(' круговое смещение и текст не будет закодирован');
readln;
end
else
{сравнивание посимвольно строк текста с несмещённым алфавитом,
при совпадении, текущему элементу присваивается символ из сме-
щенного алфавита}
{--------------------------------------------------------------------}
for i:=1 to NStr do
begin
str:=R(pos);
for j:=1 to length(str) do
begin
if (ord(str[j])>=128) and (ord(str[j])<=159) then
for k:=1 to alp do
if b_mas[k]=str[j] then
str[j]:=b_mas1[k];
if (ord(str[j])>=160) and (ord(str[j])<=175) and (k<>n)
or (ord(str[j])>=224) and (ord(str[j])<=239) and (k<>n) then
for k:=1 to alp do
if mas[k]=str[j] then
str[j]:=mas1[k];
end;
pos:=pos+1;
{$I-} {отключение контроля ошибок ввода\вывода}
assign(f,outp);
reset(f);
if IOResult<>0 then
rewrite(f)
else
append(f);
writeln(f,str);
close(f);
{$I+} {включение контроля ошибок ввода\вывода}
end;
end
else
begin
writeln('N=0, текст не будет закодирован');
readln;
end;
end;