Использование выражений, выполнение операций над объектами




Скачать 20,05 Kb.
НазваниеИспользование выражений, выполнение операций над объектами
Дата03.02.2016
Размер20,05 Kb.
ТипПрактическая работа

Практическая работа № 6

Тема: Использование выражений, выполнение операций над объектами



Цель работы: Научиться выполнять операции над объектами, используя динамические массивы

Задачи работы:

  • Работа с компонентом StringGrid;

  • Использование динамических массивов;

Перемножение матриц


Матрицей называют прямоугольную таблицу, составленную из элементов и имеющую несколько строк и столбцов. Матрицы имеют большое значение в высшей математике и математическом анализе. Кроме того, матрицы применяются и при программировании компьютерной графике, особенно трёхмерной. Например, матрицы широко применяются в OpenGL.

В этом упражнении Вы напишите программу, реализующую одну из простейших операций с матрицами - перемножение двух матриц. Заодно Вы познакомитесь с тем, как работать с компонентой StringGrid и динамическими массивами.


РЕЗУЛЬТАТ

  1. Как умножаются матрицы


Как уже говорилось, матрицы состоят из нескольких столбцов и строк. В результате умножения двух матриц получается третья матрица. Чтобы не возникало путаницы, будем считать, что матрица A умножается на матрицу B. Необходимо вычислить результирующую матрицу C. Умножение происходит следующим образом: для каждой строки матрицы A берётся каждый столбец матрицы B. Соответсвующие элементы строки матрицы A и столбца матрицы B перемножаются. Затем все полученные произведения суммируются и результат помещается в матрицу C на пересечении той же строки, что бралась в матрице A и того же столбца, что использовался в матрице B.

Объяснение кажется запутанным? Проиллюстрируем на примере. Берём первую строку матрицы A и первый столбец матрицы B. Результат будет записан в элемент на пересечении первой строки и первого столбца:



Если взять вторую строку матрицы A и второй столбец матрицы B, то результат должен быть помещён в матрицу C на пересечении второй строки и второго столбца.



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

Можно заметить два очевидных факта:

    1. Можно умножить матрицу A на матрицу B только в том случае, если количество столбцов матрицы A равно количеству строк матрицы B.

    2. У матрицы C столько же строк, сколько у матрицы A, и столько же столбцов, сколько у матрицы B.

Таким образом, если матрица A имеет размер MxN (M строк на N столбцов), а матрица B имеет размер NxK, то полученная в результате их умножения матрица C будет иметь размер MxK.
  1. Расположение компонент


Программа должна иметь средства для ввода размеров и содержимого исходных матриц. Для ввода размеров можно использовать привычные компоненты Edit, а для ввода (и вывода) содержимого матриц лучше всего подходит компонента StringGrid. Эту компоненту можно найти в категории Additional. Здесь потребуется три такие компоненты: две для исходных матриц и одна для результата.



Переключитесь в Инспектор объектов и измените у всех трёх матриц следующие свойства:

    • DefaultColWidth­ – 30;

    • DefaultRowHeight – 20;

    • FixedCols – 0;

    • FixedRows – 0.

Для первых двух матриц откройте свойство Options и установите подсвойтво goEditing в значение True. Это позволит пользователю редактировать содержимое матрицы.



Измените свойства остальных компонент, чтобы получить результат, как на рисунке:


  1. Изменение размеров матриц


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

Создайте обработчик события OnKeyPress для поля Edit1. Оно должен влиять на количество строк (RowCount) в первой и третьей матрице.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if Key=#13 then begin

StringGrid1.RowCount:=StrToInt(Edit1.Text);

StringGrid3.RowCount:=StrToInt(Edit1.Text);

Key:=#0;

end;

end;

Создайте обработчик события OnKeyPress для Edit2. Это поле должно влиять на количство столбцов (ColCount) в первой матрице и количество строк во второй:

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);

begin

if Key=#13 then begin

StringGrid1.ColCount:=StrToInt(Edit2.Text);

StringGrid2.RowCount:=StrToInt(Edit2.Text);

Key:=#0;

end;

end;

Наконец, обработчик для Edit3:

procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);

begin

if Key=#13 then begin

StringGrid2.ColCount:=StrToInt(Edit3.Text);

StringGrid3.ColCount:=StrToInt(Edit3.Text);

Key:=#0;

end;

end;

Желательно, чтобы при запуске программы начальные размеры матриц совпадали со значениями, указанными в полях ввода. Создайте обработчик события OnCreate для формы (Form1). Это событие возникает при запуске приложения. В этом обработчике просто вызовем три предыдущих обработчике, как бы имитируя нажатие клавиши Enter в них.

procedure TForm1.FormCreate(Sender: TObject);

var

Key:char;

begin

Key:=#13; Edit1KeyPress(nil,Key);

Key:=#13; Edit2KeyPress(nil,Key);

Key:=#13; Edit3KeyPress(nil,Key);

end;

Запустите программу и протестируйте возможность менять размер матриц.


  1. Перемножение матриц


Запрограммируем перемножение матриц. Оно должно происходить при нажатии на кнопку "Посчитать".

Здесь нам потребуются два двумерных динамических массива для хранения содержимого матрицы. Назовём их A и B. В первую очередь необходимо задать их размеры (первоначально они нулевые) с помощью процедуры SetLength. Первый параметр - массив, чей размер меняется, второй и третий параметры - количество столбцов и строк.

Затем необходимо перевести данные из StringGrid1 и StringGrid2 в массивы A и B. Доступ к ячейкам компоненты StringGrid осуществляется с помощью свойства Cell, которое так же является двумерным массивом. Следует учесть, что ячейки нумеруются с нуля!

Наконец, производим само умножение - перебираем все строки массива A, для каждой строки перебираем все столбцы массива B и для каждой пары строка-столбец перемножаем все их соответствующие элементы и складываем произведения. Результат записывается в соответствующую ячейку StringGrid3.

Итак, обработчик будет выглядеть так:

procedure TForm1.Button1Click(Sender: TObject);

var

A,B: array of array of integer;

M,N,L: integer;

i,j,k: integer;

s: integer;

begin

M:=StringGrid1.RowCount;

N:=StringGrid1.ColCount;

L:=StringGrid2.ColCount;

SetLength(A,N,M);

SetLength(B,L,N);


for i:=0 to N-1 do

for j:=0 to M-1 do

if StringGrid1.Cells[i,j]='' then A[i,j]:=0

else A[i,j]:=StrToInt(StringGrid1.Cells[i,j]);


for i:=0 to L-1 do

for j:=0 to N-1 do

if StringGrid2.Cells[i,j]='' then B[i,j]:=0

else B[i,j]:=StrToInt(StringGrid2.Cells[i,j]);


for i:=0 to M-1 do

begin

for j:=0 to L-1 do

begin

s:=0;

for k:=0 to N-1 do

s:=s+A[k,i]*B[j,k];

StringGrid3.Cells[j,i]:=IntToStr(s);

end;

end;

end;

Запустите и протестируйте программу.


Практическая работа № 8

Тема: Шифрование файлов



Цель работы: Научиться использовать компоненты шифрования.


Обеспечивающие средства: Персональный компьютер со следующим программным обеспечением: операционная система MS Windows, среда разработки Borland Delphi 7.


Задачи работы:

  • Научиться создавать модули

  • Научиться использовать созданные модули


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

С = Ek1(M)

M' = Dk2(C),

где:

M (message) - открытая информация (в литературе по защите информации часто носит название "исходный текст");

C (cipher text) - полученный в результате зашифрования шифртекст (или криптограмма); E (encryption) - функция зашифрования, выполняющая криптографические преобразования над исходным текстом;

k1 (key) - параметр функции E, называемый ключом зашифрования;

M' - информация, полученная в результате расшифрования;

D (decryption) - функция расшифрования, выполняющая обратные зашифрованию криптографические преобразования над шифртекстом;

k2 - ключ, с помощью которого выполняется расшифрование информации.

Понятие "ключ" в стандарте ГОСТ 28147-89 (алгоритм симметричного шифрования) определено следующим образом: "конкретное секретное состояние некоторых параметров алгоритма криптографического преобразования, обеспечивающее выбор одного преобразования из совокупности всевозможных для данного алгоритма преобразований". Иными словами, ключ представляет собой уникальный элемент, с помощью которого можно изменять результаты работы алгоритма шифрования: один и тот же исходный текст при использовании различных ключей будет зашифрован по-разному.

Для того, чтобы результат расшифрования совпал с исходным сообщением (т. е. чтобы M' = M), необходимо одновременное выполнение двух условий. Во-первых, функция расшифрования D должна соответствовать функции зашифрования E. Во-вторых, ключ расшифрования k2 должен соответствовать ключу зашифрования k1.

Если для зашифрования использовался криптостойкий алгоритм шифрования, то при отсутствии правильного ключа k2 получить M' = M невозможно. Криптостойкость - основная характеристика алгоритмов шифрования и указывает прежде всего на степень сложности получения исходного текста из зашифрованного без ключа k2.

Алгоритмы шифрования можно разделить на две категории: симметричного и асимметричного шифрования. Для первых соотношение ключей зашифрования и расшифрования определяется как k1 = k2 = k (т. е. функции E и D используют один и тот же ключ шифрования). При асимметричном шифровании ключ зашифрования k1 вычисляется по ключу k2 таким образом, что обратное преобразование невозможно, например, по формуле k1 = ak2 mod p (a и p - параметры используемого алгоритма).


Технология работы:

Запустите Delphi (ПускПрограммыBorland Delphi 7Delphi 7).

Теперь сохраните проект FileSave Project As…

После сохранения проекта добавьте новый модуль FileNewUnit

Сохраните созданный модуль под именем Crypter.pas

Измените его следующим образом:


Unit Crypter;


interface


Uses Classes;


const

StartKey = 981;

MultKey = 12674;

AddKey = 35891;


{ Зашифровать блок }

procedure EnCrypt(var Pntr: Array of Char;

ArrLen: Word; password: string); overload;

{ Расшифровать блок }

procedure DeCrypt(var Pntr: Array of Char;

ArrLen: Word; password: string); overload;

{ Зашифровать строку }

function EnCrypt(const InString:string;

StartKey,MultKey,AddKey:Integer):string; overload;

{ Расшифровать строку }

function DeCrypt(const InString:string;

StartKey,MultKey,AddKey:Integer):string; overload;

{ Зашифровать поток }

procedure EnCryptStream(var st: tStream; Password: String);

{ Расшифровать поток }

procedure DeCryptStream(var st: tStream; Password: String);


implementation


{$R-}

{$Q-}

function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer):string;

var

I : Integer;

begin

Result := '';

for I := 1 to Length(InString) do

begin

Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));

StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;

end;

end;


function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer):string;

var

I : Integer;

begin

Result := '';

for I := 1 to Length(InString) do

begin

Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));

StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;

end;

end;

{$R+}

{$Q+}


procedure EnCrypt(var Pntr: Array of Char; ArrLen:Word; password: string);

var

len,pcounter: byte;

x:Word;

begin

len := length(password) div 2;

pcounter := 1;

for x:=0 to ArrLen-1 do begin

Pntr[x] := chr(ord(password[pcounter]) + ord(Pntr[x]) + len);

inc(pcounter);

if pcounter >length(password) then pcounter := 1;

end;

end;


procedure DeCrypt(var Pntr: Array of Char; ArrLen:Word; password: string);

var

len,pcounter: byte;

x:Word;

begin

len := length(password) div 2;

pcounter := 1;

for x:=0 to ArrLen-1 do begin

Pntr[x] := chr(ord(Pntr[x]) - ord(password[pcounter]) - len);

inc(pcounter);

if pcounter >length(password) then pcounter := 1;

end;

end;


type

pBuffer = ^tBuffer;

tBuffer = Array[1..$FFFF] of Char;


procedure EnCryptStream(var st: tStream; Password: String);

var

buf: pBuffer;

StSize, StPos, p: Longint;

begin

if (@st=nil) or (Password='') then exit;

New(buf);

StPos:=st.Position;// GetPos;

StSize:=st.Size; //Size;

//st.Free; //free;

st.Seek(0,0);

repeat

p:=st.Position;

if SizeOf(Buf^)>St.Size-St.Position then st.Read(buf^,St.Size-St.Position)

else st.Read(buf^,SizeOf(Buf^));

EnCrypt(buf^,SizeOf(buf^),password);

st.free;

st.Seek(p,0);

st.Write(buf^,SizeOf(Buf^));

until (St.Size=St.Position);

st.Seek(StSize,0);

st.Seek(StPos,0);

Dispose(buf);

end;


procedure DeCryptStream(var st: tStream; Password: String);

var

buf: pBuffer;

StSize, StPos, p: Longint;

begin

if (@st=nil) or (Password='') then exit;

New(buf);

StPos:=st.Position;

StSize:=st.Size;

st.free;

st.Seek(0,0);

repeat

p:=st.Position;

if SizeOf(Buf^)>St.Size-St.Position then st.Read(buf^,St.Size-St.Position)

else st.Read(buf^,SizeOf(Buf^));

DeCrypt(buf^,SizeOf(buf^),password);

st.free;

st.Seek(p,0);

st.Write(buf^,SizeOf(Buf^));

until (St.Size=St.Position);

st.Seek(StSize,0);

st.Seek(StPos,0);

Dispose(buf);

end;


end.


Теперь сохраните модуль и перейдите к вкладке Unit1, нажмите F12. В раздел Uses добавьте модуль Crypter.

Приведите окно формы к подобному виду:



На форме расположены: 2 компонента Button, 2 компонента Memo и 2 компонента Label


Процедура кнопки зашифровать выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

var S:String;

begin

S:=Memo1.Text;

Memo2.Text:=EnCrypt(S, StartKey, MultKey, AddKey);

end;


Процедура кнопки расшифровать выглядит следующим образом:

procedure TForm1.Button2Click(Sender: TObject);

var S:String;

begin

S:=Memo2.Text;

Memo1.Text:=DeCrypt(S, StartKey, MultKey, AddKey);

end;


Измените свойство Filter у компонента OpenDialog1 следующим образом:




Программа готова. Запустите и посмотрите, как она работает. Наберите какой-либо текст и нажмите Зашифровать. Зашифрованный текст отобразится в компоненте Memo2.


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


  1. Для чего применяют шифрование?

  2. Для чего нужен ключ в алгоритме шифрования?

  3. Какие алгоритмы шифрования существуют?

  4. Какой алгоритм шифрования используется в этой программе?

Похожие:

Использование выражений, выполнение операций над объектами iconМетодическая разработка уроков по теме: «Элементы математической логики. Логические операции. Конструирование логических выражений с использованием отношений и логических операций»
Конструирование логических выражений с использованием отношений и логических операций
Использование выражений, выполнение операций над объектами iconМетодическая разработка урока Тема программы: Слесарно-сборочные работы
Выполнение простых и сложных работ (самостоятельное выполнение учащимися операций, приемов, комплекса трудовых действий)
Использование выражений, выполнение операций над объектами iconСодержание Введение
Представленная работа посвящена теме «Использование условных функций и логических выражений при решении задач в Excel»
Использование выражений, выполнение операций над объектами iconЗапуск программы и введение начальных остатков 8 2 Заполнение справочников и ввод начальных остатков 9
Перечисление налога налоговым органам, выполнение регламентированных операций за январь и разработка специального интерфейса 28
Использование выражений, выполнение операций над объектами iconОбеспечение образовательного процесса оборудованными учебными кабинетами, объектами для проведения практических занятий, объектами физической культуры и спорта № п/п
Обеспечение образовательного процесса оборудованными учебными кабинетами, объектами для проведения
Использование выражений, выполнение операций над объектами iconИсследование операций
Формирование исследования операций как самостоятельной ветви прикладной математики относится к периоду 40-х и 50-х годов
Использование выражений, выполнение операций над объектами iconОтчет ОАО кб «Восточный»
Перечень основных операций банка, оказывающих наибольшее влияние на изменение финансового результата, а также информация относительно...
Использование выражений, выполнение операций над объектами iconОтветы на вопросы, сформулированные на 10-сессии Межправительственного комитета по интеллектуальной собственности, генетическим ресурсам, традиционным знаниям и
Межправительственного комитета по интеллектуальной собственности, генетическим ресурсам, традиционным знаниям и фольклору и предназначенные...
Использование выражений, выполнение операций над объектами iconСовершенствование технологической подготовки операций для оборудования сверлильной группы в многономенклатурном производстве с учётом производственной ситуации
Для этого существует необходимость в кратчайшие сроки разработать конструкторскую документацию на изделие и эффективную технологию...
Использование выражений, выполнение операций над объектами iconПермяков Г. Л. Основы структурной паремиологии
Языковые особенности паремиологических единиц (родительских выражений) с точки зрения гендерной принадлежности
Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib2.znate.ru 2012
обратиться к администрации
Библиотека
Главная страница