
ИнфТехнКомпТехн
.pdf2.Повторить задание 1, реализовав модуль в виде DLL Complex2. Проект – приложение.
|
|
|
|
Таблица 14.1. - Варианты заданий |
||
a |
b |
c |
d |
|
Функция 1 |
|
1 |
2 |
3 |
4 |
|
Сложение |
|
5 |
6 |
7 |
8 |
|
Вычитание |
|
9 |
10 |
11 |
12 |
|
Умножение |
|
4 |
1 |
2 |
3 |
|
Сложение |
|
8 |
5 |
6 |
7 |
|
Вычитание |
|
12 |
9 |
10 |
11 |
|
Умножение |
|
3 |
8 |
1 |
2 |
|
Сложение |
|
7 |
14 |
5 |
6 |
|
Вычитание |
|
11 |
12 |
9 |
10 |
|
Умножение |
|
2 |
3 |
4 |
1 |
|
Сложение |
|
6 |
7 |
8 |
5 |
|
Вычитание |
|
10 |
11 |
12 |
9 |
|
Умножение |
|
4 |
1 |
3 |
12 |
|
Сложение |
|
8 |
5 |
7 |
10 |
|
Вычитание |
|
12 |
9 |
11 |
68 |
|
Умножение |
|
Пример выполнения Задание 1
Создать вызывающую программу, использующую модуль комплексной арифметики Complex, содержащий 4 функции: сложение, вычитание, умножение и деление. Вызывающая программа должна выполнить функцию сложения с комплексными операндами Comp1=6 + i*8 и Comp2=7 + i*11 функцию деления Op1 на ноль.
1.Командой File=>New вызываем окно архива и выбираем в нем Unit (модуль без формы). Получаем в окне Редактора кода страницу шаблона модуля с именем Unit1.
2.В редакторе кода заносим код модуля. Секции Initialization и Finalization не используем.
3.Сохраним модуль с именем Complex.Pas.
4.Компилируем модуль.
5.Командой Файл => Создать => Приложение создаем проект вызывающей программы. Форма приложения приведена на Рис. 14.1.
Форма содержит:
Метки Label1…Label6 для отображения поясняющих надписей.
Однострочные редакторы Edit1…Edit4 для ввода значений переменных a, b, c, d.
Многострочный редактор Memo1 для вывода результатов.
Кнопки BitBtn1…BitBtn4 с именами Ввод, Выполнить, Очистить, Закрыть. Кнопка Ввод принимает значения введенных переменных, Копка Выполнить осуществляет вычисления и выводит результаты. Кнопка Очистить удаляет содержимое поля результатов, Кнопка Закрыть завершает работу программы (дублирует стандартную кнопку закрытия окна Windows).
6.В коде модуля формы вызывающей программы добавляем:
В строку uses ссылку на модуль Complex.
В раздел var переменные a,b,c,d типа real и Comp1, Comp2, Comp3 типа TComplex.
7.Создаем обработчики нажатия кнопок.
8.Сохраняем проект под именем Prg_13_1.
211

|
|
Рисунок 14.1 - Форма приложения |
|
|
Листинг модуля Complex: |
|
|
||
unit Complex; |
// Комплексная арифметика |
|
||
interface type |
|
// Тип комплексного числа |
|
|
TComplex = Record |
|
|||
Re, Im: Real |
|
|
|
|
end; |
|
|
// |
Комплексное |
function AddC(x,y: TComplex):TComplex; |
||||
сложение |
|
|
// |
Комплексное |
function SubC(x,y: TComplex):TComplex; |
||||
вычитание |
|
|
// |
Комплексное |
function MultC(x,y: TComplex):TComplex; |
||||
умножение |
|
|
// |
Комплексное |
function DivC(x,y: TComplex):TComplex; |
||||
деление |
|
|
|
|
implementation |
|
|
|
|
function AddC(x,y: TComplex):TComplex; |
|
|
||
begin |
|
|
|
|
Result.Re:=x.Re + y.Re; Result.Im:=x.Im + y.Im; end; //AddC
function SubC(x,y: TComplex):TComplex; begin
Result.Re:=x.Re - y.Re; Result.Im:=x.Im - y.Im; end; //SubC
function MultC(x,y: TComplex):TComplex; begin
Result.Re:=x.Re*y.Re - x.Im*y.Im; Result.Im:=x.Re*y.Im + x.Im*y.Re;
end; {MultC}
function DivC(x,y: TComplex):TComplex; var z: Real;
begin z:=sqr(y.Re)+sqr(y.Im);
try //Защита при делении на 0
Result.Re:=(x.Re*y.Re + x.Im*y.Im)/z; Result.Im:=(x.Re*y.Im - x.Im*y.Re)/z;
except// Если делитель 0, то. Result.Re:=1.1e309; Result.Im:=1.1e309 end;
212
end; {DivC} end.
Листинг модуля формы вызывающей программы: unit Prg_13_1_;
interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Complex;
type |
|
|
|
TForm1 = class(TForm) |
Выполнить |
||
bbRun: TBitBtn; // |
Кнопка |
||
bbClose: TBitBtn; |
// Кнопка Закрыть |
||
bbVvod: TBitBtn;// |
Кнопка |
Ввод |
|
bbClear: TBitBtn; |
// Кнопка Очистить |
||
Edit1: TEdit; |
// |
для a |
|
Edit2: TEdit; |
// |
для b |
|
Edit3: TEdit; |
// |
для c |
|
Edit4: TEdit; |
// |
для d |
значения переменных |
Label1: TLabel; // |
Введите |
||
Label2: TLabel; // |
a = |
|
|
Label3: TLabel; // |
b = |
|
|
Label4: TLabel; // |
c = |
|
|
Label5: TLabel; // |
d = |
|
|
Label6: TLabel; // |
Результаты |
Memo1: TMemo;
procedure bbRunClick(Sender: TObject);
procedure bbVvodClick(Sender: TObject); procedure bbClearClick(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1; a,b,c,d: real;
Comp1, Comp2, Comp3:TComplex; implementation
{$R *.DFM}
procedure TForm1.bbRunClick(Sender: TObject);
begin Comp1.Re:=a; Comp1.Im:=b; Comp2.Re:=c; Comp2.Im:=d; Comp3:=AddC(Comp1,Comp2); memo1.Lines.Add('Исходные данные'); memo1.Lines.Add('Comp1='+FloatToStr(Comp1.Re)+’+i*'+FloatToStr (Comp1.Im)); memo1.Lines.Add('Comp2='+FloatToStr(Comp2.Re)+'+i*'+FloatToStr (Comp2.Im)); memo1.Lines.Add('');
memo1.Lines.Add('Результат комплексной операции’); memo1.Lines.Add('Comp3='+FloatToStr(Comp3.Re)+'+i*'+FloatToStr (Comp3.Im));
end;
procedure TForm1.bbVvodClick(Sender: TObject);
begin a:=StrToFloat(Edit1.Text); b:=StrToFloat(Edit2.Text); c:=StrToFloat(Edit3.Text); d:=StrToFloat(Edit4.Text);
end;
procedure TForm1.bbClearClick(Sender: TObject);
213
begin memo1.Clear; end;
end.
Задание 2
Повторить задание 1, реализовав модуль в виде DLL Complex2. Проект – приложение.
1.Командой Файл => Создать => Еще вызываем окно архива и выбираем в нем DLL. Получаем в окне Редактора кода страницу шаблона DLL с именем Project1.
2.В редакторе кода заносим в нее код DLL. Подпрограммы те же, что в модуле
Complex задания 1. Секция begin…end –пустая.
3.Сохраним DLL с именем Complex2.Pas.
4.Компилируем DLL. Итог Complex2.dll.
5.Так как DLL не экспортирует типов, то создаем вспомогательный модуль Complex1, содержащий только интерфейсную часть с описанием типа TComplex и имен вызываемых подпрограмм DLL. Сохраняем его под именем Complex1.
6.Командой Файл => Создать => Приложение создаем проект вызывающей программы. Форму делаем аналогичной заданию 1.
7.В коде модуля формы вызывающей программы добавляем:
В строку uses ссылку на модуль Complex1.
В раздел var переменные a, b, c, d типа real, Comp1, Comp2, Comp3 типа TComplex.
8.Создаем обработчики нажатия кнопок.
9.Сохраняем проект под именем Prg_11_2.
Листинг DLL Complex2 |
// Комплексная арифметика |
|
library Complex2; |
|
|
uses |
|
|
SysUtils, Classes; |
|
|
{$R *.RES} |
|
|
type |
// Тип комплексного числа |
|
TComplex = record |
|
|
Re, Im: real |
|
|
end; |
|
Комплексное |
function CAdd(x,y:TComplex):TComplex; export; // |
||
сложение |
|
|
begin |
|
|
Result.Re:=x.Re + y.Re; Result.Im:=x.Im + y.Im; |
|
|
end; // CAdd |
|
Комплексное |
function CSub(x,y:TComplex):TComplex; export; // |
||
вычитание |
|
|
begin |
|
|
Result.Re:=x.Re - y.Re; Result.Im:=x.Im - y.Im; |
|
|
end; // CSub |
|
Комплексное |
function CMult(x,y:TComplex):TComplex; Export;// |
||
умножение |
|
|
begin |
|
|
Result.Re:=x.Re*y.Re - x.Im*y.Im; Result.Im:=x.Re*y.Im + x.Im*y.Re;
end; // CMult
function CDiv(x,y:TComplex):TComplex; Export; // Комплексное деление
214
var z: real; begin
z:=sqr(y.Re)+sqr(y.Im);
try //Защита при делении на 0 Result.Re:=(x.Re*y.Re + x.Im*y.Im)/z; Result.Im:=(x.Re*y.Im - x.Im*y.Re)/z; except// Результат, если делитель 0 Result.Re:=1.1e309; Result.Im:=1.1e309 end;
end; // СDiv
exports // Список экспорта
CAdd Index 1 Name 'AddC' Resident, CSub Index 2 Name 'SubC', CMult Index 3 Name 'MultC', CDiv Index 4 Name ‘DivC’;
begin end. |
|
|
|
Листинг модуля Complex1 unit Complex1; interface |
|
||
type |
|
|
|
TComplex=record // Тип комплексного числа |
|
||
Re, Im: real |
|
|
|
end; |
|
|
|
// Вызываемые функции |
External |
'Complex2' |
|
function |
AddC(x,y:TComplex):TComplex; |
||
Index 1; |
SubC(x,y:TComplex):TComplex; |
External |
'Complex2' |
function |
Index 2; function MultC(x,y:TComplex):TComplex; External 'Complex2' Index 3; function DivC(x,y:TComplex):TComplex; External 'Complex2' Index 4;
implementation end.
Листинг модуля формы вызывающей программы такой же, как в задании 1, только в строке uses добавлена ссылка на мо-
дуль Complex1. В этом модуле устанавливается связь с DLL.
Выводы
1.Для работы с часто используемыми подпрограммами применяются модули и DLL
2.Модуль или DLL - это набор готовых подпрограмм, хранящихся в компилированном виде.
3.Модуль связывается с вызывающей программой при компоновке.
4.DLL связывается с вызывающей программой динамически: DLL загружается на время обращения к ее подпрограммам.
5.Одна и та же DLL может использоваться несколькими параллельно работающими программами.
15. Таблицы
Подготовка к работе
По указанной литературе изучить:
1.Cвойства компонентов Label, Button, Edit, StringGrid.
2.Cобытия onClick, onChange, onCreate.
3.Как создать код обработчика события.
4.Контрольные вопросы
5.События onClick, onCreate.
6.Назначение и свойства компонента кнопка.
7.Назначение и свойства компонент метка.
215
8.Назначение и свойства компонента однострочный редактор.
9.Назначение и свойства компонента StringGrid.
10.Как инициализировать таблицу при старте приложения.
11.Как создать обработчик события onClick.
12.Как создать обработчик события onDblClick.
13.Как создать обработчик события onChange.
14.Как использовать строковые данные для вычислений.
15.Как увеличить число строк в таблице.
16.Как уменьшить число строк в таблице.
17.Как увеличить число столбцов в таблице.
18.Как увеличить число столбцов в таблице.
19.Подпрограммы. Основные понятия.
Задание
Создать проект “Таблица конвертации” для конвертации рублей России в разные валюты с учетом комиссии. В таблице предусмотреть возможность редактирования содержимого ячеек, добавления и удаления строк и столбцов. Варианты заданий приведены в табл. 15.1.
|
|
Таблица 15.1 - Варианты заданий |
|
Валюты |
|
|
|
|
|
|
|
Доллар США |
Фунт стерлингов |
Евро |
|
Фунт стерлингов |
Евро |
Рубль Беларуси |
|
Евро |
Японская йена |
Гривна Украины |
|
Японская йена |
Рубль Беларуси |
Японская йена |
|
Рубль Беларуси |
Гривна Украины |
Доллар США |
|
Гривна Украины |
Фунт стерлингов |
Доллар США |
|
Доллар США |
Японская йена |
Фунт стерлингов |
|
Фунт стерлингов |
Японская йена |
Евро |
|
Евро |
Рубль Беларуси |
Японская йена |
|
Японская йена |
Гривна Украины |
Рубль Беларуси |
|
Рубль Беларуси |
Фунт стерлингов |
Гривна Украины |
|
Гривна Украины |
Евро |
Японская йена |
|
Доллар США |
Японская йена |
Рубль Беларуси |
|
Фунт стерлингов |
Рубль Беларуси |
Гривна Украины |
|
Евро |
Гривна Украины |
Фунт стерлингов |
|
Пример выполнения Задание
Создать проект “Таблица конвертации” для конвертации с учетом комиссии рублей России в валюты США, Великобритании и Европейского союза.
Выполнение
1.Запустить Delphi.
2.Создать в ней новое приложение.
3.ПРисвоить свойству Caption компонента Form1 значение Пересчет денежных сумм.
4.Сохранить модуль под именем Prg_14_1_, а проект под именем Prg_14_1.
5.Установить на форме компоненты: однострочные редакторы Edit1 и Edit2, метки
Label1 - Label4, кнопки Button1But- ton7 (со страницы Standard), таблицу строк
StringGrid1 (со страницы Additional). Компоненты расположить, как показано на Рис. 15.1.
6.Задать следующие свойства компонент:
216

Компонент |
Caption (Надпись) |
Name (Имя) |
Описание функций |
|
|
|
|
|
|
StringGrid1 |
|
StringGrid1 |
Основная таблица |
|
Edit1 |
|
EdCell |
Редактирование ячейки |
|
Edit2 |
|
EdSum |
Редактирование суммы |
|
Label1 |
Редактор ячеек |
Label1 |
Поясняющая надпись |
|
Label2 |
Сумма для конвертации |
Label2 |
Поясняющая надпись |
|
Label3 |
Таблица |
Label3 |
Заголовок |
|
Label4 |
LbDate |
Label4 |
Текущая дата |
|
Button1 |
OK |
SellAgree |
Принятие изменений текущей |
|
ячейки |
||||
|
|
|
||
Button2 |
Принято |
SumAgree |
Принятие суммы и расчет по курсу |
|
|
|
|
|
|
Button3 |
Выход |
Exit |
Выход из приложения |
|
Button4 |
< |
DecCol |
Уменьшение числа столбцов на 1 |
|
|
|
|
|
|
Button5 |
> |
IncCol |
Увеличение числа столбцов на 1 |
|
|
|
|
|
|
Button6 |
/\ |
DecRow |
Уменьшение числа строк на 1 |
|
Button7 |
\/ |
IncRow |
Увеличение числа строк на 1 |
Рисунок 15.1 - Заготовка интерфейса проекта "Таблица"
После вышеперечисленных установок интерфейс проекта примет вид Рис. 15.2.
Рисунок 15.2 - Интерфейс проекта в режиме конструирования
217
Листинг модуля формы проекта: unit Prg_14_1_; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm) StringGrid1: TStringGrid; EdCell: TEdit; EdSum: TEdit;
SellAgree: TButton; SummAgree: TButton; Exit: TButton; DecCol: TButton; IncCol: TButton; DecRow: TButton; IncRow: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure DecColClick(Sender: TObject); procedure IncColClick(Sender: TObject); procedure DecRowClick(Sender: TObject); procedure IncRowClick(Sender: TObject); procedure ExitClick(Sender: TObject); procedure SellAgreeClick(Sender: TObject);
procedure StringGrid1DblClick(Sender: TObject); procedure SummAgreeClick(Sender: TObject); private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1; implementation {$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin StringGrid1.ColCount:=6; StringGrid1.RowCount:=4; StringGrid1.Cells[0,0]:='Валюта'; StringGrid1.Cells[1,0]:='Курс рубля; StringGrid1.DefaultColWidth:=78; StringGrid1.Cells[2,0]:='Сумма выдачи'; StringGrid1.Cells[3,0]:='Комиссия, %'; StringGrid1.Cells[4,0]:='Комиссионные'; StringGrid1.Cells[5,0]:='Взнос, руб.'; StringGrid1.Cells[0,1]:='USA'; StringGrid1.Cells[0,2]:='FST'; StringGrid1.Cells[0,3]:='EUR'; StringGrid1.cells[1,1]:='31,5'; StringGrid1.cells[1,2]:='45'; StringGrid1.cells[1,3]:='32,1'; StringGrid1.cells[3,1]:='2'; StringGrid1.cells[3,2]:='2'; StringGrid1.cells[3,3]:='2';
Label4.Caption:='По состоянию на '+DateToStr(Date); end;
procedure TForm1.DecColClick(Sender: TObject);
begin |
StringGrid1.ColCount>2 |
then |
if |
StringGrid1.ColCount:=StringGrid1.ColCount-1; end;
procedure TForm1.IncColClick(Sender: TObject); begin StringGrid1.ColCount:=StringGrid1.ColCount+1;
218
end;
procedure TForm1.DecRowClick(Sender: TObject); begin
if StringGrid1.RowCount>2 then StringGrid1.RowCount:=StringGrid1.RowCount-1;
end;
procedure TForm1.IncRowClick(Sender: TObject); begin StringGrid1.RowCount:=StringGrid1.RowCount+1; end;
procedure TForm1.ExitClick(Sender: TObject); begin
Close;
end;
procedure TForm1.SellAgreeClick(Sender: TObject); begin
StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:=EdCell.Tex
t;
end;
procedure TForm1.StringGrid1DblClick(Sender: TObject); begin
if (StringGrid1.Col=1) and (StringGrid1.Row>0) then
EdCell.Text:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row
];
end;
procedure TForm1.SummAgreeClick(Sender: TObject); var
ResVal, Komis:real; i:byte; S:string; begin
with form1 do
for i:=1 to StringGrid1.RowCount-1 do
if (StrToFloat(StringGrid1.Cells[1,i])<>0) then begin Komis:=StrToFloat(EdSum.Text)/100* StrToFloat(StringGrid1.Cells[3,i]); ResVal:=(StrToFloat(EdSum.Text)-Komis)/ StrToFloat(StringGrid1.Cells[1,i]); str(Komis:0:2,s); StringGrid1.Cells[4,i]:=s; str(ResVal:0:2,s); StringGrid1.Cells[2,i]:=s; str(StrToFloat(EdSum.Text):0:2,s); StringGrid1.Cells[5,i]:=s;
end; end;end.
Впрограмме применены следующие методы:
1.FormCreate. Он при создании формы заносит начальные данные в таблицу по координатам ячеек ACol (номер столбца) и ARow (номер строки). Одельным ячейкам компонента StringGrid1 через свойство StringGrid.Cell [ACol, ARow] п.
Рисваиваются текстовые значения, а свойству Caption метки Label4 значение текущего времени.
2.CellAgreeClick. Он данные из текстового "Редактора ячеек" EdCell при нажатии на кнопку SellAgree (ОК) заносит в таблицу по текущим координатам выделенной ячейки таблицы. Учтите, что данные заносятся, как текстовая информация.
219

3.StringGrid1DblClick. Он позволяет двойным щелчком мыши по ячейкам таблицы переносить данные из таблицы в окно "Редактора ячеек" EdCell для их дальнейшего быстрого редактирования. Например, при изменении курса или процента комиссионных. Доступ к координатам текущей ячейки обеспечивается с помощью свойств Col и Row компонента StringGrid1. Редактировать надо только курсы валют.
4.SumAgreeClick. С его помощью данные из текстового редактора "Сумма для конвертации" EdSum при нажатии на кнопку SumAgree (Принято) заносятся в таблицу по текущим координатам. Учтите, что данные воспринимаются редактором, как текстовая информация, а вычисления необходимо производить с числами.
5.Для изменения размеров таблицы используются свойства ColCount и RowCount. Следующие 4 метода увеличивают или уменьшают числа столбцов и строк в процессе выполнения программы щелчками (вызывают событие onClick) по кнопкам размеров таблицы:
Уменьшение числа столбцов TForm1.DecColClick.
Увеличение числа столбцов TForm1.IncColClick.
Уменьшение числа строк TForm1.DecRowClick.
Увеличение числа строк TForm1.IncRowClick.
6.Для завершения работы с программой использован метод ExitClick, при
осуществлении которого закрывается основная форма. Дублируется кнопка закрытия окна Windows.
Запустить проект на выполнение и опробовать действие всех кнопок. Внести в EdSum сумму для конвертации и проконтролировать результат расчетов в соответствующих ячейках. Изменить курс валюты и проконтролировать, как это повлияет на результаты расчетов. Форма при исполнении имеет вид Рис. 15.3.
Рисунок 15.3 – Форма при исполнении
Выводы
1.Для создания таблиц используется компонент StringGrid (таблица строк).
2.Для управления используются компоненты Button (кнопка) и их обработчики событий.
3.Для пояснений используются компоненты Label (метка).
4.Для ввода данных используются компоненты Edit (однострочный редактор).
5.Кнопка “Выход” дублирует стандартную кнопку завершения приложения Windows.
16. Графика, отображение графиков функций
Подготовка к работе
1. По рекомендованной литературе изучить графические средства Delphi.
220