Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.10.2016, 18:36
Smile188 Smile188 вне форума
Прохожий
 
Регистрация: 02.10.2016
Сообщения: 18
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Исправить программу

Помогите немножко исправить
Смысл таков, что нужно самим вводить кол-во столбцов и строк в матрице

Задача:
открытый текст записывается в матрицу по определенному ключу 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  
Старый 17.10.2016, 18:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Непонятно, что именно надо делать (собственно. по алгоритму шифрования). По работе с динамическими массивами:
Код:
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  
Старый 18.10.2016, 04:26
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Оффтоп конечно, но ошибка в ДНК имхо
ТС не смог задать вопрос.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 21.10.2016, 10:04
Smile188 Smile188 вне форума
Прохожий
 
Регистрация: 02.10.2016
Сообщения: 18
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Я сделала так как вы сказали, но у меня все равно программа не правильно расшифровывает(шифрует?)
вот сам код
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter