- •Тема 1. Разработка линейных программ
- •Этапы разработки программы
- •Переменные и константы
- •Оператор присваивания
- •Структура программы на языке Object Pascal
- •Некоторые функции преобразования типов
- •Среда программирования Delphi Главные составные части среды программирования
- •Состав проекта
- •Сохранение проекта
- •Структура модуля
- •Компиляция и выполнение проекта
- •Тема 2. Стандартные и библиотечные функции в линейных программах в данной теме рассматриваются следующие вопросы:
- •Некоторые стандартные библиотечные функции
- •Некоторые функции и процедуры даты
- •Ввод из окна ввода
- •Вывод в окно сообщения
- •Тема 3. Программы с разветвлениями
- •Логические выражения
- •Условный оператор
- •Оператор выбора
- •Оператор перехода
- •Компонент ListBox
- •Компонент ComboBox
- •Некоторые приемы работы с отладчиком
- •Тема 4. Циклы
- •Операторы цикла
- •Оператор цикла с параметром
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Компонент Memo
- •Тема 5. Использование массивов в программах, компонента Memo для ввода данных в массив в данной теме рассматриваются следующие вопросы:
- •Массивы
- •Компонент Memo для ввода и вывода массивов
- •Тема 6. Разработка многооконных проектов. Двумерные массивы. Компонента StringGrid
- •Компонент StringGrid
- •Технология создания многооконных проектов
- •Ввод и вывод двумерных массивов c помощью компонента StringGrid
- •Тема 7. Внешние файлы
- •Процедуры работы с файлами
- •Главное меню
- •Тема 8. Разработка внутренних процедур и функций в данной теме рассматриваются следующие вопросы:
- •Процедуры
- •Функции
- •Литература
- •Оглавление
Ввод и вывод двумерных массивов c помощью компонента StringGrid
После создания на форме строковой таблицы (компонент StringGrid) и задания с помощью инспектора объектов ее свойств, в программе нужно записать группу операторов для подписи строк и столбцов таблицы, чтобы пользователю программы было понятно, как вводить данные. Их можно записать в отдельной процедуре, связанной с событием выход (Exit) из компонента Edit, где вводится размерность массива или в процедуре, связанной с событием создания формы (FormCreate).
{Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.}
procedure TForm1.Edit1Exit(Sender: TObject);
Var i,j:Integer;//номера строки столбца квадратной матрицы
begin
//порядок матрицы получает свое значение из поля ввода
N:=StrToInt(Edit1.Text);
//свойство количество строк компонента StringGrid
//получает значение: порядок +1
StringGrid1.RowCount:=N+1;
//свойство количество столбцов компонента StringGrid
//получает значение порядок: +1
StringGrid1.ColCount:=N+1;
//подпись заголовка таблицы
For i:=1 to StringGrid1.RowCount do
StringGrid1.Cells[i,0]:= IntToStr(i);
//подпись строк таблицы
For j:=1 to StringGrid1.ColCount do
StringGrid1.Cells[0,j]:= IntToStr(j);
//добавление в свойства таблицы признака
//допустимости редактирования содержимого ячеек таблицы
StringGrid1.Options:= StringGrid1.Options +[goEditing];
end;
Пример подписи строк и столбцов таблицы
StringGrid1.ColCount:=N+1;
//подпись заголовка таблицы
For i:=1 to StringGrid1.RowCount do
StringGrid1.Cells[i,0]:= IntToStr(i);
//подпись строк таблицы
For j:=1 to StringGrid1.ColCount do
StringGrid1.Cells[0,j]:= IntToStr(j);
Замечание
Напоминаем, что для создания процедуры связанной с каким–то событием, произошедшим с компонентом, нужно перейти на вкладку Events (события), найти нужное событие в строке, например OnCreate и справа вписать название события (в данном примере Create). В модуле автоматически будет создана заготовка процедуры создания формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
Если щелкнуть по компоненту Edit, то автоматически будет создана заготовка процедуры обработки события изменение компонента Edit:
procedure TForm1.Edit1Change(Sender: TObject);
begin
end;
Нужно изменить событие Change (изменить) на выход. Для этого обязательно перейти на вкладку события (Events) в инспекторе объектов. В строке OnExit раскрыть список, выбрать название Edit1Change и заменить Change на Exit.
Для ввода двумерного массива из StrigGrid необходимо записать операторы, подобные этим:
For i:=1 to StringGrid1.RowCount-1 do
For j:=1 to StringGrid1.ColCount-1 do
begin
Massiv[i,j]:=StrToFloat(StringGrid1.Cells[i,j]);
end; {в данном случае begin и end можно опустить}
Для вывода:
For i:=1 to StringGrid1.ColCount-1 do
For j:=1 to StringGrid1.RowCount-1 do
StringGrid1.Cells[j,i]:=FloatToStr(Massiv[i,j]);
Практика
Задача
Составить программу для транспонирования квадратной матрицы порядка N и определения следа матрицы.
Транспонированной матрицей к исходной, является такая матрица, у которой элементы строк исходной матрицы расставлены в столбцы, а элементы столбцов исходной в строки.
Следом матрицы называется сумма главных диагональных элементов.
Компоненты
Имя компонента |
Свойства компонент |
Значение |
Назначение |
Form1 |
Caption |
Матрица |
Заголовок главной формы |
Label1 |
Caption |
Программа предназначена для преобразования квадратной матрицы (количество строк равно количеству столбцов) |
Справочная информация для пользователя программы |
Label2 |
Caption |
Размерность матрицы |
Подсказка пользователю |
Edit1 |
Text |
….. |
Поле для ввода размерности матрицы |
Form1.StringGrid1 |
ColCount
FixedCol
FixedRow
Options: goFixedVertLine
goFixedHorzLine
goVertLine
goHorzLine
goTabs
goAlwaysShowEditor |
5
1
1
True
True
True
True
True
True
|
Количество столбцов по умолчанию
Количество фиксированных слева столбцов
Количество фиксированных сверху строк
Опции: Разметка зафиксированных вертикальных линий
Разметка зафиксированных горизонтальных линий
Разметка вертикальных линий внутри таблицы
Разметка горизонтальных линий внутри таблицы
Разрешает использование клавиши Tab для перемещения в другую ячейку Признак нахождения компонента в режиме редактирования |
Form1.Button1 |
Caption |
Транспонированная матрица |
Кнопка для выполнения транспонирования и вывода в новое окно |
Form1.Button2 |
Caption |
След матрицы |
Кнопка для вычисления следа матрицы и вывода в новое окно |
Form1.Button3 |
Caption |
Выход |
Кнопка для завершения работы программы |
Form2 |
Caption |
Транспонированная матрица |
Заголовок формы |
Form2.StringGrid1 |
ColCount
FixedCol
FixedRow
Options: goFixedVertLine
goFixedHorzLine
goVertLine
goHorzLine
goTabs
goAlwaysShowEditor |
5
1
1
True
True
True
True
True
True
|
Количество столбцов по умолчанию
Количество фиксированных слева столбцов
Количество фиксированных сверху строк
Опции: Разметка зафиксированных вертикальных линий
Разметка зафиксированных горизонтальных линий
Разметка вертикальных линий внутри таблицы
Разметка горизонтальных линий внутри таблицы
Разрешает использование клавиши Tab для перемещения в другую ячейку
Признак нахождения компонента в режиме редактирования |
Form2.Button1 |
Caption |
Выход |
Кнопка для закрытия окна “Транспонированная матрица” |
Form3 |
Caption |
След матрицы |
Заголовок формы |
Label1 |
Caption |
Сумма главных диагональных элементов матрицы называется следом матрицы |
Справочная информация для пользователя программы |
Label2 |
Caption |
|
Поле для вывода, рассчитанного программой значения следа матрицы |
Form3.Button1 |
Caption |
Выход |
Кнопка для закрытия окна “След матрицы” |
Переменные и массивы
Обозначение в программе |
Содержание |
Тип |
N |
Порядок квадратной матрицы |
целый |
M |
Квадратная матрица действительных чисел |
вещественный, расширенный |
I |
Текущий номер строки матрицы или столбца в StringGrid |
целый |
J |
Текущий номер столбца матрицы или строки в StringGrid |
целый |
Sled |
След матрицы |
вещественный, расширенный |
Проекты форм
Для решения данной задачи рекомендуется создать три окна.
Текст модуля
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Grids,Unit2,Unit3;
// программистом подключаются модули, связанные со второй и
//третьей формами
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
M :array [1..100,1..100] of Extended; //квадратная матрица
N:Integer;// порядок матрицы
Sled: Extended; //след матрицы
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//процедура читает из таблицы на главной форме квадратную матрицу
//транспонирует матрицу и выводит в таблицу StringGrid
// на вторую форму
procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer; //номер строки матрицы/номер столбца StringGrid
j:Integer; // номер столбца матрицы/номер строки StringGrid
begin
//чтение значений квадратной матрицы из компонента StringGrid
// главной формы
For i:=1 to StringGrid1.RowCount-1 do
For j:=1 to StringGrid1.ColCount-1 do
begin
M[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);
end;
// открывается вторая форма
Form2.Show;
//количеству строк и столбцов компонента StringGrid на второй форме
//присваивается значение порядок: матрицы +1
Form2.StringGrid1.RowCount:=N+1;
Form2.StringGrid1.ColCount:=N+1;
// подписываются заголовок таблицы, и номера строк
For i:=1 to Form2.StringGrid1.RowCount do
Form2.StringGrid1.Cells[i,0]:= IntToStr(i);
For j:=1 to Form2.StringGrid1.ColCount do
Form2.StringGrid1.Cells[0,j]:= IntToStr(j);
{вывод в компонент StringGrid на второй форме транспонированной матрицы}
{Транспонированная матрица не создается. Транспонирование осуществляется путем вывода столбца исходной матрицы в строку компонента StringGrid. В StringGrid номер столбца i, номер строки j.}
For i:=1 to Form2.StringGrid1.ColCount-1 do
For j:=1 to Form2.StringGrid1.RowCount-1 do
Form2.StringGrid1.Cells[i,j]:=FloatToStr(M[i,j]);
end;
{Процедура подготовки таблицы на форме для ввода квадратной матрицы, которая выполняется при выходе из поля ввода размерности матрицы.}
procedure TForm1.Edit1Exit(Sender: TObject);
Var i,j:Integer;//номера строки столбца квадратной матрицы
begin
//порядок матрицы получает свое значение из поля ввода
N:=StrToInt(Edit1.Text);
//свойство количество строк компонента StringGrid
//получает значение: порядок +1
StringGrid1.RowCount:=N+1;
//свойство количество столбцов компонента StringGrid
//получает значение порядок: +1
StringGrid1.ColCount:=N+1;
//подпись заголовка таблицы
For i:=1 to StringGrid1.RowCount do
StringGrid1.Cells[i,0]:= IntToStr(i);
//подпись строк таблицы
For j:=1 to StringGrid1.ColCount do
StringGrid1.Cells[0,j]:= IntToStr(j);
//добавление в свойства таблицы признака
//допустимости редактирования содержимого ячеек таблицы
StringGrid1.Options:= StringGrid1.Options +[goEditing];
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close
end;
//процедура вычисляет след матрицы и выводит результат
//на третью форму
procedure TForm1.Button2Click(Sender: TObject);
Var i: Integer;
begin
Sled:=0;
Form3.Show;
For i:=1 to Form1.StringGrid1.ColCount-1 do
Sled:= Sled + M[i,i];
Form3.Label2.Caption:=' След матрицы равен ' + FloatToStr(Sled)
end;
end.
{Модуль, связанный со второй формой}
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm2 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Close
end;
end.
{Модуль, связанный с третьей формой.}
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
M :array [1..100,1..100] of Extended;
N:Integer;
Sled: Extended;
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
Form3.Close
end;
end.
Тестовый пример
Задачи для самостоятельного решения
№ 6.1 .Дана действительная матрица размера N х M элементов:
-
a11 a12 a13 ... a1m
а21 a22 a23 ... a2m
.................... …
аn1 an2 an3 ... anm
Найти сумму положительных элементов матрицы.
№ 6.2 Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых — нули; б) все элементы которых четны.
№ 6.3 Дана действительная матрица размера N х M элементов, все элементы которой различны. Найти наибольший и наименьший элементы матрицы.
№ 6.4 Дана целочисленная квадратная матрица порядка n. Подсчитать: а) количество нулей, стоящих на главной диагонали; б) количество единиц в матрице.
№ 6.5 Дана действительная матрица размера N х M элементов, все элементы которой различны. Указать номер строки и столбца, на пересечении которых находится минимальный элемент матрицы. Подсчитать количество отрицательных элементов.
№ 6.6 Дана целочисленная квадратная матрица порядка n. Найти номера строк: а) все элементы которых положительны; б) все элементы которых нечетны.
№ 6.7 Дана целочисленная квадратная матрица порядка n. Найти номера столбцов: а) все элементы которых отрицательны; б) все элементы равны нулю.
№ 6.8 Дана действительная матрица размера N х M элементов:
a11 a12 a13 ... a1m
а21 a22 a23 ... a2m
.................... …
аn1 an2 an3 ... anm
Найти номера строк матрицы, где все элементы различны.
№ 6.9 Дана целочисленная квадратная матрица порядка n. Подсчитать: а) произведение элементов главной диагонали; б) количество нулей.
№ 6.10 Дана действительная матрица размера N х M элементов, все элементы которой различны. Вывести элементы матрицы, которые меньше среднего арифметического из ее элементов.