Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.doc
Скачиваний:
6
Добавлен:
12.11.2019
Размер:
1.51 Mб
Скачать

Контрольные вопросы

  1. Особенности работы с двумерными массивами в Delphi

  2. Автоматическое заполнение двумерного массива

  3. Заполнение двумерного массива вручную

  4. Свойства и методы компонента StringGrid

  5. Работы с компонентом RadioGroup.

Лабораторная работа № 5. Процедуры и функции в delphi

ЦЕЛЬ ЗАНЯТИЯ: Освоить работу с процедурами и функциями в среде Delphi.

ПОДГОТОВКА К РАБОТЕ:

  1. Изучить особенности организации процедур и функций;

  2. Изучить методы описания процедур и функций и способы передачи параметров.

Задание. Создать приложение, выполняющее шифрование/дешифрирование строки текста методом гаммирования с использованием процедур.

Под гаммированием понимают процесс наложения по оп­ределенному закону гаммы шифра на открытые данные. Гамма шифра - это псевдослучайная последовательность, выработанная по заданному алгоритму для шифрования открытых данных и дешифрирования зашифрованных данных.

Процесс шифрования заключается в генерации гаммы шифра и наложении полученной гаммы на исходный открытый текст обратимым образом, например с использованием операции сложения по модулю 2.

Приложение, выполняющее шифрование/дешифрирование приведено на рисунке 5.1. Список компонентов приложения приведен в таблице 5.1.

В данном примере каждый символ исходного текста складывается по модулю 2 с очередным символом гаммы шифра (функция XOR).

Гамма шифра вводится пользователем с клавиатуры.

Операция дешифрования выполняется аналогично операции шифрования.

Таблица 5.1. Список компонентов приложения

Компонент

Описание

Label1

Метка «Гамма шифра»

Label2

Метка «Исходный текст»

Label3

Метка «Шифртекст»

Edit1

Окно ввода гаммы шифра

Edit2

Окно ввода исходного текста при шифровании и вывода расшифрованного текста при дешифрировании

Edit3

Окно вывода зашифрованного текста

Button1

Кнопка «Шифровать»

Button2

Кнопка «Дешифровать»

Button3

Кнопка «Очистить исходный текст»

Последовательность действий

Так как в данном случае операции шифрования и дешифрования выполняются аналогично, можно использовать одну процедуру и для шифрования и для дешифрования.

Процедура шифрования/ дешифрования имеет вид:

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

Var i,j:Integer;

begin

s_Rez:=''; i:=1;

While i<=Length(s_Source) do

begin

For j:=1 to Length(s_gamma) do

s_rez:=s_rez+chr(ord(s_source[i+j-1]) xor ord(s_gamma[j]));

i:=i+Length(s_gamma);

end;

end;

где s_source- исходная строка. При шифровании – это исходный текст, при дешифрировании – это шифртекст;

s_gamma - гамма шифра;

s_rez – результирующая строка. При шифровании – это шифртекст, при дешифрировании – исходный текст.

Процедура работает следующим образом:

  1. В цикле For последовательно каждый символ гамма шифра складывается по модулю 2 с символами исходного текста.

  2. Если длина текста больше, чем длина гаммы шифра (сравнение выполняется оператором While), то пункт 1 повторяется.

Рассмотрим следующие варианты подключения процедуры proc_encr;

  1. Процедура proc_encr является членом класса TForm1;

  2. Процедура proc_encr не является членом класса TForm1, а описана в блоке implementation;

  3. Процедура proc_encr описана в дополнительном модуле Unit2;

  4. Процедура proc_encr является членом класса TForm2, то есть описана в другом модуле. (например, Unit2).

Вариант 1. Процедура proc_encr является членом класса TForm1

Для реализации данного варианта выполните следующие действия:

  1. Объявите процедуру proc_encr как процедуру-член класса TForm1:

type

TForm1 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

………………………….

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

private

{ Private declarations }

public

{ Public declarations }

end;

  1. В блоке implementation выполните описание процедуры proc_encr:

implementation

{$R *.DFM}

procedure TForm1.proc_encr(s_source,s_gamma:String;Var s_rez:String);

Var i,j:Integer;

{тело процедуры, описание приведено выше}

end;

  1. Для события OnClick кнопки Button1 напишите программный код:

procedure TForm1.Button1Click(Sender: TObject);

Var s1,s2,s3:String;

begin

s1:=Edit2.text; {Запомнить исходную строку}

s2:=Edit1.text; {Запомнить строку гаммы шифра}

proc_encr (s1,s2,s3);

Edit3.Text:=s3; {Вывод результата шифрования}

end;

  1. Для события OnClick кнопки Button2 напишите программный код:

procedure TForm1.Button2Click(Sender: TObject);

Var s1,s2,s3:String;

begin

s1:=Edit3.text; {Запомнить зашифрованную строку}

s2:=Edit1.text; {Запомнить строку гаммы шифра}

proc_encr (s1,s2,s3);

Edit2.Text:=s3; {Вывод результата дешифрирования}

end;

  1. Для события OnClick кнопки Button3 напишите программный код:

procedure TForm1.Button3Click(Sender: TObject);

begin

Edit2.Text:='';

end;

  1. Откомпилируйте приложение и проверьте его работу.

Вариант 2. Процедура proc_encr не является членом класса TForm1, а описана в блоке implementation

Для реализации данного варианта выполните следующие действия:

  1. В блоке implementation выполните описание процедуры proc_encr:

implementation

{$R *.DFM}

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

Var i,j:Integer;

begin

{тело процедуры}

end;

  1. Программный код для событий OnClick кнопок Button1, Button2 и Button3 аналогичен программному коду варианта 1.

  2. Откомпилируйте приложение и проверьте его работу.

Вариант 3. Процедура proc_encr описана в дополнительном модуле Unit2

Для реализации данного варианта выполните следующие действия:

  1. Создайте новый модуль Unit2 (File | New | Unit). Назовите его Unit2.

  2. В блоке interface модуля Unit2 объявите процедуру proc_encr, чтобы ее можно было использовать в других модулях:

  3. В блоке implementation модуля Unit2 опишите процедуру proc_encr.

  4. Модуль Unit2 имеет вид:

unit Unit2;

interface

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

implementation

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

Var i,j:Integer;

begin

{тело процедуры}

end.

  1. В модуле Unit1 выполните подключение модуля Unit2:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2;

  1. Программный код для событий OnClick кнопок Button1, Button2 и Button3 модуля Unit1 аналогичен программному коду вариантов 1 и 2.

  2. Откомпилируйте приложение и проверьте его работу.

Вариант 4. Процедура proc_encr является членом класса TForm2

Для реализации данного варианта выполните следующие действия:

  1. Создайте новую форму (File | New | Form). Назовите ее Form2. Данной форме соответствует модуль Unit2. Форма Form2 изображена на рисунке 5.2.

  1. В модуле Unit2 объявите процедуру proc_encr как член класса TForm2.

  2. В блоке implementation модуля Unit2 опишите процедуру proc_encr.

  3. Модуль Unit2 имеет вид:

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants,

Classes, Graphics, Controls, Forms, Dialogs;

type

TForm2 = class(TForm)

procedure proc_encr(s_source,s_gamma:String;Var s_rez:String);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

procedureTForm2.proc_encr(s_source,s_gamma:String;Var s_rez:String);

Var i,j:Integer;

begin

{тело процедуры}

end;

{$R *.dfm}

end.

  1. В модуле Unit1 выполните подключение модуля Unit2:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2;

  1. Для события OnClick кнопки Button1 (модуль Unit1) напишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

Var s1,s2,s3:String;

begin

s1:=Edit2.text; s2:=Edit1.text;

Form2.proc_encr (s1,s2,s3); Edit3.Text:=s3;

end;

  1. Для события OnClick кнопки Button2 (модуль Unit1) напишите следующий программный код:

procedure TForm1.Button2Click(Sender: TObject);

Var s1,s2,s3:String;

begin

s1:=Edit3.text; s2:=Edit1.text;

Form2.proc_encr (s1,s2,s3); Edit2.Text:=s3;

end;

  1. Программный код события OnClick кнопки Button3 (модуль Unit1) соответствует программному коду в вариантах 1,2 и 3.

  1. Откомпилируйте приложение и проверьте его работу.