Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИнфТехнКомпТехн

.pdf
Скачиваний:
20
Добавлен:
02.04.2015
Размер:
35.33 Mб
Скачать

2.Повторить задание 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