- •Программирование на языке
- •Object pascal в среде delphi
- •(Лабораторные работы)
- •Содержание
- •Лабораторная работа 1. Программирование линейных алгоритмов
- •1.1. Базовые элементы языка Object Pascal
- •1.1.1. Алфавит языка
- •1.1.2. Синтаксис языка
- •1.1.3. Основные типы данных
- •1.1.4. Оператор присваивания
- •1.1.5. Целые типы данных
- •1.1.6. Вещественные (действительные) типы данных
- •1.1.8. Cимвольные типы данных
- •1.1.9. Строкоые типы данных
- •1.1.10. Арифметические вычисления
- •1.2. Интегрированная среда разработчика delphi
- •1.3. Структура программ delphi
- •Interface
- •Implementation
- •1.4. Пример написания программы
- •1.4.2. Изменение заголовка формы
- •1.4.6. Написание программы обработки события
- •1.4.7. Написание программы обработки события
- •2.3. Оператор выбора Case
- •2.4. Составной оператор
- •2.5. Некоторые возможности, предоставляемые Delphi для организации разветвлений
- •Interface
- •Implementation
- •2.7. Индивидуальные задания
- •3.1.2. Организация цикла с помощью оператора repeat
- •3.2. Организация вложенных циклов
- •3.3. Организация прерывания цикла
- •3.4. Алгоритмы, использующие рекуррентную последовательность
- •3.5. Пример написания программы
- •Interface
- •Implementation
- •3.6. Индивидуальные задания
- •Лабораторная работа 4. Программирование с использованием массивов
- •4.1. Работа с массивами
- •4.2. Операции над массивами
- •4.3. Примеры часто встречающихся алгоритмов работы с массивами
- •4.4. Компонент tStringGrid для ввода/вывода массивов
- •4.5. Пример написания программы с использованием tStringGrid
- •Interface
- •Implementation
- •4.6. Компонент tEdit для ввода одномерных массивов
- •4.7. Пример написания программы с использованием tEdit
- •4.7. Компонент tMemo для ввода/вывода одномерных массивов
- •4.8. Пример написания программы с использованием tMemo
- •4.9. Индивидуальные задания
- •Лабораторная работа 5. Программирование с использованием строковых данных
- •5.1. Работа со строками
- •5.2. Пример написания программы
- •Лабораторная работа 6. Программирование с использованием подпрограмм и модулей
- •6.1. Описание подпрограмм
- •6.2. Передача данных через формальные параметры
- •6.3. Процедурные типы
- •6.4. Область видимости переменных
- •6.5. Пример написания программы с использованием процедур
- •Interface
- •Implementation
- •6.6. Использование модулей
- •6.7. Пример написания программы с использованием модуля
- •6.7.1. Создание модуля
- •6.7.2. Подключение модуля
- •Implementation
- •6.8. Индивидуальные задания
- •Лабораторная работа 7. Построение графиков
- •7.1. Компонент tChart
- •7.2. Пример написания программы
- •7.4. Индивидуальные задания
- •Лабораторная работа 8. Работа с файлами
- •8.2. Прямая работа с файлами (классический способ)
- •Доступ к файлам
- •Подпрограммы для работы с файлами
- •Запись и чтение типизированных файлов
- •Запись и чтение нетипизированных файлов
- •8.3. Диалоги открытия и сохранения файлов
- •8.4. Пример написания программы
- •8.5. Индивидуальные задания
- •Средства отладки программ в delphi
- •Литература
6.3. Процедурные типы
Язык Object Pascal позволяет объявлять типы и переменные процедурного типа, например:
type TPt1 = function(x:integer):integer;
var Pt1 : Tpt1;
Pt2 : procedure(var s:extended);
Использование процедурных типов позволяет использовать имя подпрограммы в качестве формального параметра.
6.4. Область видимости переменных
Все константы, типы, переменные, процедуры и функции могут использоваться только в определенных местах программы. Часть программы, в которой определен данный конкретный элемент называется областью видимости. При этом часто пользуются понятием блок, который состоит из объявления элемента и составного оператора:
<объявление>
begin
<операторы>
end;
Элементы называются локальными, если область видимости ограничена только блоком, в котором элемент объявлен. Если элемент объявлен и интерфейсной части модуля, то он будет виден во всех модулях, подключивших данный модуль, поэтому такой элемент является глобальным.
Если элемент объявлен в головном файле программы или в подпрограмме, то область его видимости начинается от точки объявления и заканчивается концом текущего блока.
Если элемент объявлен в интерфейсной части модуля, то область видимости будет включает текущий модуль, а так же все модули, которые подключили данный модуль.
Если элемент объявлен в разделе инициализации, то область видимости включает все подпрограммы, расположенные в данном разделе.
6.5. Пример написания программы с использованием процедур
Задание: Двухмерный массив (матрица) вещественных чисел A, размером NxM, вводится с клавиатуры (компонент TStringGrid). Найти количество положительных элементов массива и их сумму, а также количество отрицательных элементов массива и их произведение (см. пример 4.5). Оформить ввод двумерного массива из TStringGrid и его вывод в ТМемо процедурами.
Интерфейс программы будет таким же, что и примере 4.5, а текст программы с процедурами приведен на Листинге 6.1.
Листинг 6.1
unit Unit1;
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, jpeg, ExtCtrls, Spin;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
StringGrid1: TStringGrid;
Button2: TButton;
Memo1: TMemo;
Button1: TButton;
Label3: TLabel;
Image1: TImage;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label4: TLabel;
Label5: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure SpinEdit1Change(Sender: TObject);
procedure SpinEdit2Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TMatr = array[1..10,1..10] of real; // Объявление типа матрицы размером 10х10
var
Form1: TForm1;
A : TMatr; // Глобальное объявление матрицы
n, m : integer;
Implementation
{$R *.dfm}
//============================================================
Procedure Vvod_Matr_iz_Tabl(StringGrid : TStringGrid; var n, m : integer;
var Matr : TMatr);
//ввод матрицы из StringGrid
var
i, j : integer;
begin
With StringGrid do begin
n := RowCount-1; //число строк матрицы
m := ColCount-1; //число столбцов матрицы
for i := 1 to n do
for j := 1 to m do
Matr[i, j] := StrToFloat(Cells[j, i]);
end;
end;
//============================================================
Procedure Vyvod_Matr(n, m : integer; Matr : TMatr; Memo : TMemo);
//вывод матрицы в Мемо
var
i, j : integer;
St : string;
begin
St := 'Введенная матрица:'+#13#10;
for i := 1 to n do begin
for j := 1 to m do
St := St+FloatToStr(Matr[i, j])+#9;
St := St+#13#10;
end;
Memo.Lines.Add(St);
end;
//============================================================
procedure TForm1.FormCreate(Sender: TObject);
//первоначальное формирование интерфейса программы
var i, j: integer;
begin
Memo1.Clear;
SpinEdit1.Text := '4';
SpinEdit2.Text := '4';
With StringGrid1 do begin
RowCount:=StrToInt(SpinEdit1.Text)+1;
ColCount:=StrToInt(SpinEdit2.Text)+1;
Cells[0, 0] := ' A';
for i:=1 to RowCount do Cells[0, i] := ' i=' + IntToStr(i);
for j:=1 to ColCount do Cells[j, 0] := ' j=' + IntToStr(j);
end;
end;
//---------------------------------------------------------------
procedure TForm1.SpinEdit1Change(Sender: TObject);
//изменение Числа строк в таблице
var i : integer;
begin
if SpinEdit1.Text = '' then Exit;
//подготовка таблицы по строкам
With StringGrid1 do begin
RowCount := StrToInt(SpinEdit1.Text)+1;
for i:=1 to RowCount do Cells[0, i] := ' i=' + IntToStr(i);
end;
end;
//--------------------------------------------------------
procedure TForm1.SpinEdit2Change(Sender: TObject);
//изменение Числа столбцов в таблице
var j : integer;
Begin
if SpinEdit2.Text = '' then Exit;
//подготовка таблицы по столбцам
With StringGrid1 do begin
ColCount := StrToInt(SpinEdit2.Text)+1;
for j := 1 to ColCount do StringGrid1.Cells[j, 0] := ' j=' + IntToStr(j);
end;
end;
//--------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
//выполнить
var
i, j, k, ke : integer;
p, pe : real;
s : string;
begin
{Проверка на заполненность таблицы}
With StringGrid1 do begin
for i := 1 to RowCount-1 do
for j := 1 to ColCount-1 do
if Cells[j, i] = '' then begin
ShowMessage('Надо заполнить все ячейки таблицы !!!');
Exit;
end;
end;
{Ввод матрицы А из таблицы StringGrid1}
Vvod_Matr_iz_Tabl(StringGrid1, n, m, A); //вызов процедуры
{Расчет}
k := 0; ke:=0;
p:=0; pe := 1;
for i := 1 to n do
for j := 1 to m do
if A[i, j] > 0 then begin k := k+1; p := p + A[i,j]; end
else
if (A[i,j] < 0) then begin ke := ke+1; pe := pe * A[i,j]; end;
Memo1.Clear;
{Показаваем в Мемо1 введенную матрицу А}
Vyvod_Matr(n, m, A, Memo1); //вызов процедуры
{показываем в Мемо1 результаты расчета}
if k=0 then Memo1.Lines.Add('Положительных элементов нет !')
else begin
Memo1.Lines.Add('Количество положительных элементов: ' +IntToStr(k));
Memo1.Lines.Add('Сумма положительных элементов: ' + FloatToStr(p));
end;
Memo1.Lines.Add('');
if ke=0 then Memo1.Lines.Add('Отрицательных элементов нет !')
else begin
Memo1.Lines.Add('Количество отрицательных элементов: ' +IntToStr(ke));
Memo1.Lines.Add('Произведение отрицательных элементов: '+ FloatToStr(pe));
end;
end;
//-------------------------------------------------------------------
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
{текст этой процедуры здесь не приводится, так как он полностью соответствует тексту примера 4.5}
end;
//---------------------------------------------------
end.