![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите немножко исправить
Смысл таков, что нужно самим вводить кол-во столбцов и строк в матрице Задача: открытый текст записывается в матрицу по определенному ключу k1, определяющему порядок записи открытого текста в строки матрицы при шифровании. Шифртекст образуется при считывании из этой матрицы по ключу k2, определяющему, в каком порядке записывается информация из столбцов матрицы. Для реализации такого варианта перестановки можно не использовать непосредственно матрицу, а осуществлять перерасчет коэф- фициентов. Код:
program Project2; {$APPTYPE CONSOLE} uses Windows, SysUtils; Const q=100; h=100; var Text,Text_1,Text_2,text_3,S:String; Textmatr:Array[1..q,1..h] of Char; i,j,k,kolsimvolov,code:integer; key1:array[1..q] of Byte; key2:array[1..h] of Byte; p,t,m:Boolean; r,b:integer; Begin SetConsoleCP(1251); SetConsoleOutputCP(1251); repeat write ('введите кол-во строк в матрице : '); readln (r); write ('введите кол-во столбцов в матрице : '); readln (b); Write('Введи текст для кодировки: '); Readln(Text); kolsimvolov:=Length(text); m:=True; if kolsimvolov>r*b then m:=False; if not(m) then writeln('количество символов не должно превышать ',r*b); until m; If (kolsimvolov div (r*b))<> 1 then //если кол-во символов текста не кратно кол-ву символов в блоке дополняем его пробелами repeat begin text:=text+' '; Inc(kolsimvolov); end; until kolsimvolov=r*b; Repeat Write('Ведите ключ 1 ', q,' без пробелов): '); Readln(S); for i:=1 to q do Val(S[i],key1[i],Code); p:=true; p:=true; for i:=1 to q-1 do for j:=i+1 to q do if (key1[i]=key1[i+1]) then p:=false; If Not(p) then writeln('Все символы должны быть различными!'); Until p; Repeat Write('введите ключ 2 ', h, ' цифры без пробелов): '); Readln(S); for i:=1 to h do Val(S[i],key2[i],Code); p:=true; for i:=1 to h-1 do for j:=i+1 to h do if (key2[i]=key2[j]) then t:=false; If Not(t) then writeln('Все цифры должны быть различными!'); Until t; Writeln; //----------------------------------------------------— For i:=1 to q do For j:=1 to h do Textmatr[key1[i],j]:=Text[(i-1)*h+j]; Writeln(' k1\k2 '); For i:=1 to q do begin Write(' ',i,' '); For j:=1 to h do write(' ',textmatr[i,j],' '); Writeln; end; //----------------------------------------------------— Text_1:=''; For j:=1 to k do for i:=1 to q do begin S:=textmatr[i,key2[j]]; Text_1:=Text_1+S; end; Writeln('Закодированный текст:',' ',text_1); //-----------------------------------------------------— Text_2:=''; For j:=1 to h do begin S:=Copy(Text_1,(key2[j]-1)*q+1,q); Text_2:=Text_2+S; end; Text_3:=''; For i:=1 to q do For j:=1 to h do begin S:=Copy(Text_2,(j-1)*q+key1[i],1); Text_3:=Text_3+S; end; Writeln('Раскодированный текст:',' ',Text_3); //-----------------------------------------------------— Writeln; Readln; End. |
#2
|
|||
|
|||
![]() Непонятно, что именно надо делать (собственно. по алгоритму шифрования). По работе с динамическими массивами:
Код:
var Textmatr : Array of Array of Char; key1 : array of Byte; key2 : array of Byte; q : Integer; h : Integer; ... Write('Введите кол-во строк:'); readln(q); Write('Введите кол-во столбцов:'); readln(h); SetLength(Textmatr,q); For I := Low(Textmatr) To High(Textmatr) Do SetLength(Textmatr[i],h); SetLength(key1,q); SetLength(key2,h); Low() - возвращает нижний индекс массива (в принципе, для дин. массива это 0) High() - возвращает верхний индекс массива (в принципе, для дин. массива это Lenght()-1) |
#3
|
||||
|
||||
![]() Оффтоп конечно, но ошибка в ДНК имхо
ТС не смог задать вопрос. Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
![]() Я сделала так как вы сказали, но у меня все равно программа не правильно расшифровывает(шифрует?)
вот сам код Код:
var Text, Text_1, Text_2, text_3, S: String; i, j, kolsimvolov: integer; key1: array of Byte; key2: array of Byte; p, m,t: Boolean; r, b: integer; Textmatr: Array of array of Char; begin write('введите кол-во строк в матрице : '); readln(r); write('введите кол-во столбцов в матрице : '); readln(b); //---- SetLength(Textmatr,r); For I := Low(Textmatr) To High(Textmatr) Do SetLength(Textmatr[i],b); SetLength(key1,r); SetLength(key2,b); repeat Write('введите текст для кодировки: '); Readln(Text); kolsimvolov:=Length(text); m:=True; if kolsimvolov>r*b then m:=False; if not(m) then writeln('Кол-во символов не должно привышать r*b '); until m; If (kolsimvolov div (r*b))<> 1 then begin text:=text+' '; Inc(kolsimvolov); end; Repeat Writeln('Введите ключ 1 , состоящий из ',r,' символов, через "Enter"'); for i:=0 to r-1 do Readln(key1[i]); p:=true; for i := 0 to r - 2 do for j := i + 1 to r - 1 do if (key1[i]=key1[i+1]) then p:=false; If Not(p) then writeln('Все символы должны быть различны!'); Until p; Repeat Writeln('Введите ключ 2, состоящий из ',b,' символов, через "Enter"'); for i:=0 to b-1 do Readln(key2[i]); t:=true; for i := 1 to b - 2 do for j := i + 1 to b - 1 do if (key2[i]=key2[i+1]) then t:=false; If Not(t) then writeln('Все символы должны быть различны!'); Until t; Writeln; //----------------------------------------------------— Writeln; //----------------------------------------------------— For i:=0 to r-1 do For j:=0 to b-1 do BEGIN //OutPutDebugString(PWideChar(inttostr(i)+' '+inttostr(j))); Textmatr[key1[i]-1,j]:=Text[(i)*b+j+1]; END; Writeln(' k1\k2 '); For i:=0 to r-1 do begin Write(' ',i,' '); For j:=0 to b-1 do write(' ',textmatr[i,j],' '); Writeln; end; //----------------------------------------------------— Text_1:=''; For j:=0 to b-1 do for i:=0 to r-1 do begin S:=textmatr[i,key2[j]-1]; Text_1:=Text_1+S; end; Writeln('Закодированный текст:',' ',text_1); //-----------------------------------------------------— Text_2:=''; For j:=0 to b-1 do begin S:=Copy(Text_1,(key2[j]-1)*r+1,r); Text_2:=Text_2+S; end; Text_3:=''; For i:=0 to r-1 do For j:=0 to b-1 do begin S:=Copy(Text_2,(j-1)*r+key1[i],1); Text_3:=Text_3+S; end; Writeln('Раскодированный текст:',' ',Text_3); //-----------------------------------------------------— Writeln; Readln; End. а должно быть вот такгг.png Последний раз редактировалось Smile188, 21.10.2016 в 11:20. |