- •Предисловие
- •Основы программирования
- •Понятие алгоритма.
- •Алгоритм Евклида.
- •Задача о поездах и мухе
- •Вместо лирического отступления
- •Этапы подготовки задачи для решения на компьютере
- •Примеры разработки алгоритмов
- •Решение квадратного уравнения.
- •Вычисление интегралов
- •Обработка результатов эксперимента
- •Решение системы линейных алгебраических уравнений
- •Введение в язык программирования Pascal
- •Основные элементы языка
- •Переменные. Стандартные типы.
- •Операции отношения
- •Раздел описаний переменных
- •Выражения. Порядок выполнения операций.
- •Константы
- •Комментарии в программе
- •Операторы
- •2.1.7.1. Оператор присваивания
- •2.1.7.2. Операторы ввода/вывода
- •2.1.7.3. Операторы инкремента и декремента
- •Среда разработки Lazarus
- •Русский язык в консольных приложениях
- •Первая программа
- •Открытие существующего проекта
- •Другие способы создания консольных приложений
- •Типовой пустой проект
- •Операции с целыми числами
- •Вместо лирического отступления 2
- •Стандартные функции с целыми аргументами
- •Операции с вещественными числами (тип real).
- •Форматирование вывода
- •Одновременное использование вещественных и целых чисел.
- •Другие стандартные функции с вещественными аргументами
- •Булевы переменные
- •Условные операторы.
- •2.1.22.1 Оператор if …. then
- •2.1.22.2. Оператор if …then ... else
- •Операторы цикла
- •2.1.23.1. Оператор цикла с предусловием
- •2.1.23.2. Оператор цикла с постусловием
- •2.1.23.3. Оператор цикла с параметром.
- •2.1.23.4. Второй вариант оператора цикла с параметром
- •Оператор выбора case
- •Организация простейшего контроля ввода данных.
- •Вычисление сумм сходящихся рядов
- •Реализация некоторых алгоритмов главы 1.
- •Программа решения задачи о поездах и мухе
- •Программа вычисления определенного интеграла
- •Более сложные элементы языка
- •Общая структура Паскаль – программы
- •Процедуры и функции
- •3.1.1.1 Структура процедуры
- •3.1.1.2. Структура функции
- •3.1.1.3 Глобальные и локальные переменные
- •3.1.1.4 Способы передачи параметров
- •3.1.1.5 Процедуры завершения
- •Еще раз о типах данных
- •Классификация типов данных
- •3.2.1.1 Целый тип
- •3.2.1.2. Интервальный тип
- •3.2.1.3. Перечислимый тип
- •3.2.1.4. Множества
- •3.2.1.5. Логический тип
- •3.2.1.6. Вещественный тип
- •3.2.1.7. Указатели
- •Обработка символьной информации в Паскале
- •Символьные и строковые типы данных.
- •3.3.1.1. Тип Char
- •3.3.1.2. Функции для работы с символами
- •3.3.1.3. Тип String
- •3.3.1.4. Строковые процедуры и функции
- •Массивы
- •Динамические массивы
- •Программа решения системы линейных алгебраических уравнений методом Гаусса
- •3.4.1.1. Вариант 1 – с goto
- •3.4.1.2. Вариант 2 – без goto
- •3.4.1.3. Вариант 3 – наилучшая реализация
- •Модули в Паскале
- •Структура модуля
- •Системные модули
- •3.5.2.1. Модуль CRT
- •Файлы
- •Тип данных – запись
- •Файловые типы
- •Процедуры для работы с файлами
- •3.6.3.1. Общие процедуры для работы с файлами всех типов
- •3.6.3.2. Процедуры для работы с текстовыми файлами
- •3.6.3.3. Процедуры для работы с типизированными файлами
- •3.6.3.4. Процедуры для работы с нетипизированными файлами
- •3.6.3.5. Организация контроля ввода/вывода при работе файлами
- •3.6.3.6. Создание простой базы данных с типизированными файлами.
- •Алгоритмы сортировки
- •Обменная сортировка (метод "пузырька")
- •Сортировка выбором
- •Сортировка вставками
- •Метод быстрой сортировки
- •Алгоритмы поиска
- •Поиск в массивах
- •Вставка и удаление элементов в упорядоченном массиве
- •Динамические структуры данных
- •Представление в памяти компьютера динамических структур.
- •Реализация стека с помощью массивов
- •Указатели
- •Стандартные операции с линейными списками
- •Реализация динамических структур линейными списками
- •4.3.6.1. Реализация стека
- •4.3.6.2. Реализация очереди с помощью линейного списка
- •4.3.6.3. Реализация двоичного дерева с помощью линейного списка
- •Сортировка и поиск с помощью двоичного дерева
- •Три источника и три составные части ООП.
- •Классы и объекты.
- •Обращение к членам класса.
- •Инкапсуляция
- •Спецификаторы доступа.
- •Свойства.
- •Наследование
- •Полиморфизм
- •Раннее связывание.
- •Позднее связывание.
- •Конструкторы и деструкторы.
- •Элементы графического интерфейса
- •Различия между консольными и графическими приложениями
- •Визуальное программирование в среде Lazarus
- •Создание графического приложения
- •Форма и ее основные свойства
- •Компоненты
- •Обработчики событий
- •Простейшие компоненты
- •6.3.5.1. Компонент TLabel
- •6.3.5.2. Кнопки TButton, TBitBtn и TSpeedButton
- •6.3.6.1. Компонент TEdit
- •6.3.6.2. Компонент TLabeledEdit
- •6.3.7.1. Компонент TMaskEdit
- •Специальные компоненты для ввода чисел
- •Тестирование и отладка программы
- •Компоненты отображения и выбора данных
- •6.3.10.1. Компонент TMemo
- •6.3.10.2. Компонент TStringGrid
- •6.3.10.3. Компоненты выбора
- •Компонент TListBox
- •Компонент TComboBox
- •Компоненты выбора – переключатели
- •6.3.10.4. Компоненты отображения структурированных данных
- •Компонент TTreeView
- •Компонент TListView
- •Организация меню. Механизм действий - Actions
- •6.3.11.1. Компонент TMainMenu
- •6.3.11.2. Компонент TToolBar
- •6.3.11.3. Компонент TActionList
- •6.3.11.4. Создание приложений с изменяемыми размерами окон
- •Послесловие
- •Литература
- •Алфавитный указатель
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
6.3.10.2. Компонент TStringGrid
TStringGrid находится во вкладке Additional и имеет вид, рис. 6.59.
Рис. 6.59. Вид компонента TStringGrid
Компонент представляет собой таблицу, состоящую из строк Rows и
столбцов Cols. В свою очередь таблица это двумерный массив, значениями которого являются строки символов и, следовательно, имеет тип string. Дос-
туп к данным осуществляется через свойство Cells. Ячейке таблицы, нахо-
дящейся на пересечении столбца с номером Col и строки с номером Row, соот-
ветствует элемент массива Cells[Col,Row]. Обратите внимание, вначале указывается столбец, а затем строка. Нумерация столбцов и строк начинается с нуля. Основные свойства компонента TStringGrid следующие:
ColCount – количество столбцов таблицы;
RowCount – количество строк таблицы;
FixedCols – количество фиксированных столбцов таблицы. Обычно фик-
сируется один, самый левый столбец и используется для задания постоянной информации, например, заголовка столбца. Но можно зафиксировать и больше столбцов. При этом зафиксированные столбцы выделяются цветом и при гори-
зонтальной прокрутке таблицы остаются на месте;
FixedRows – количество фиксированных строк таблицы. Точно так же,
607
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
фиксируется обычно одна строка для задания заголовка, но можно зафиксиро-
вать и больше строк. Строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте;
FixedColor – цвет фиксированных строк и столбцов.
VisibleColCount – количество видимых (прокручиваемых) столбцов,
равно ColCount – FixedCols;
VisibleRowCount – количество видимых (прокручиваемых) строк, равно
RowCount – FixedRows;
ScrollBars – определяет наличие в таблице полос прокрутки. Если ука-
зать значение ssAutoBoth, то полосы прокрутки будут появляться и исчезать автоматически в зависимости от того, помещается таблица в окно компонента или нет.
Во вкладке Options свойств TStringGrid определены ряд свойств,
наиболее важными из которых являются:
goEditing – разрешает или запрещает редактирование содержимого яче-
ек таблицы. true – редактирование разрешено, false – запрещено;
goTab – разрешает (true) или запрещает (false) использование клави-
ши <Таb> для перемещения курсора в следующую ячейку таблицы;
goAlwaysShowEditor – признак нахождения компонента в режиме ре-
дактирования. Если значение свойства false, то для того, чтобы в ячейке поя-
вился курсор, надо начать набирать текст, нажать клавишу <F2> или сделать щелчок мышью.
Итак, вернемся к реализации метода Гаусса решения системы линейных алгебраических уравнений. Для ввода коэффициентов расширенной матрицы системы воспользуемся компонентом TStringGrid. Создайте новый проект и спроектируйте вид приложения так, как показано на рисунке 6.60.
Установите следующие свойства компонента TStringGrid:
ColCount = 1; RowCount = 1; FixedCols = 0; FixedRows = 0;
608
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
goEditing = true; goTab = true;
goAlwaysShowEditor = true;
Рис. 6.60. Форма приложения
Код программы:
unit Unit1;
{$mode objfpc}{$H+} interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Grids, LCLType, LCLProc;
type
{ TForm1 }
TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Label4: TLabel; Memo1: TMemo;
StringGrid1: TStringGrid;
609
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject;
var Key: char); procedure FormShow(Sender: TObject);
procedure Gauss(var vector: array of extended; var b: array of extended;
var x: array of extended; var n: integer);
procedure StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); private
{private declarations } public
{public declarations } end;
var
Form1: TForm1; n: integer;
a:array of array of extended;{матрица коэффициентов системы, двумерный динамический массив}
vector: array of extended; {преобразованный одномерный динамический массив }
b:array of extended;
x: array of extended; implementation
{ TForm1 }
procedure TForm1.Gauss(var vector: array of extended; var b: array of extended; var x: array of extended; var n: integer);
var
a: array of array of extended;{матрица коэффициентов системы, двумерный динамический массив}
i, j, k, p, r: integer; m, s, t: real;
begin try
SetLength(a, n, n); {установка фактического размера массива Преобразование одномерного массива в двумерный}
610
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
k:= 1;
for i:= 0 to n - 1 do for j:= 0 to n - 1 do begin
a[i, j]:= vector[k]; k:= k + 1;
end;
for k:= 0 to n - 2 do begin
for i:= k + 1 to n - 1 do begin
if (a[k, k]= 0) then begin
{перестановка уравнений} p:= k;
for r:= i to n - 1 do begin
if abs(a[r, k]) > abs(a[p, k]) then p:= r; end;
if p <> k then begin
for j:= k to n - 1 do begin
t:= a[k, j];
a[k, j]:= a[p, j]; a[p, j]:= t;
end;
t:= b[k]; b[k]:= b[p]; b[p]:= t;
end;
end; // конец блока перестановки уравнений m:= a[i, k] / a[k, k];
a[i, k]:= 0;
for j:= k + 1 to n - 1 do begin
a[i, j]:= a[i, j] - m * a[k, j]; end;
b[i]:= b[i] - m * b[k]; end;
end;
{Проверка существования решения} if a[n - 1, n - 1] <> 0 then
611
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
begin
x[n - 1]:= b[n - 1] / a[n - 1, n - 1]; for i:= n - 2 downto 0 do
begin s:= 0;
for j:= i + 1 to n - 1 do begin
s:= s - a[i, j] * x[j]; end;
x[i]:= (b[i] + s) / a[i, i]; end; Memo1.Lines.Add('Решение:'); for i:= 0 to n - 1 do
Memo1.Lines.Add('x' + IntToStr(i + 1) + '=' + FloatToStr(x[i]));
end else
if b[n - 1] = 0 then Memo1.Lines.Add('Система уравнений' +
' не имеет решения.')
else
Memo1.Lines.Add('Система уравнений' +
' имеет бесконечное множество решений.');
except
on EInvalidOP do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
on EMathError do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
on EZeroDivide do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
on EOverflow do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
on EUnderflow do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
on EAccessViolation do
Memo1.Lines.Add('Неправильные данные. Система уравнений' + ' не имеет решения.');
612
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
end;
a:= nil; // освобождение памяти end;
procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; Shift:TShiftState);
begin
if (Key = VK_Return) then begin
if (StringGrid1.Col >= n) then begin
StringGrid1.Row:= StringGrid1.Row + 1; StringGrid1.Col:= 0;
Key:= 0; end;
end;
end;
procedure TForm1.FormShow(Sender: TObject); begin
StringGrid1.ColCount:= 1;
StringGrid1.RowCount:= 1; Edit1.SetFocus; Button3.Visible:= true; Button4.Visible:= false;
end;
procedure TForm1.Button1Click(Sender: TObject); begin
Memo1.Clear;
StringGrid1.Clean; StringGrid1.ColCount:= 1; StringGrid1.RowCount:= 1; Edit1.Clear; Edit1.SetFocus; Button3.Visible:= true; Button4.Visible:= false;
end;
procedure TForm1.Button2Click(Sender: TObject); begin
{освобождение памяти, распределенной для динамических массивов}
a:= nil; vector:= nil; x:= nil;
b:= nil;
613
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
Close();
end;
procedure TForm1.Button3Click(Sender: TObject); begin
Edit1.SetFocus;
if Length(Edit1.Text) = 0 // если пустая строка then exit;
n:= StrToInt(Edit1.Text); StringGrid1.ColCount:= n + 1; StringGrid1.RowCount:= n ; Stringgrid1.SetFocus; Button3.Visible:= false; Button4.Visible:= true;
end;
procedure TForm1.Button4Click(Sender: TObject); begin
if (StringGrid1.Col >= n) then begin
StringGrid1.Row:= StringGrid1.Row + 1; StringGrid1.Col:= 0;
end else
StringGrid1.Col:= StringGrid1.Col+1; end;
procedure TForm1.Button5Click(Sender: TObject); var i, j, k, code:integer;
begin
{Установка реальных размеров динамических массивов} SetLength(a, n, n);
SetLength(vector, n * n); SetLength(b, n); SetLength(x, n);
for j:= 0 to n - 1 do for i:= 0 to n - 1 do begin
val(StringGrid1.Cells[i, j], a[i, j], code); if code <> 0 then
begin
ShowMessage('Ошибка при вводе коэффициентов матрицы'); StringGrid1.SetFocus;
exit;
end;
end;
614
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
for j:= 0 to n - 1 do begin
val(StringGrid1.Cells[n, j], b[j], code); if code <> 0 then
begin
ShowMessage('Ошибка при вводе свободных членов'); StringGrid1.SetFocus;
exit;
end;
end;
code:=0;
{Преобразование двумерного массива в одномерный} k:= 1;
for j:= 0 to n - 1 do for i:= 0 to n - 1 do begin
vector[k]:= a[i, j]; k:= k + 1;
end;
{Вызов процедуры решения системы линейных алгебраических уравнений методом Гаусса}
Gauss(vector, b, x, n); end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
if Key = #13 then begin
if Length(Edit1.Text) = 0 // если пустая строка then exit;
n:=StrToInt(Edit1.Text); StringGrid1.ColCount:= n + 1; StringGrid1.RowCount:= n ; Stringgrid1.SetFocus;
exit;
end;
{разрешаем только цифры, знак минус и кл. BackSpace} if not (Key in ['0' .. '9', #8])
then begin
Key:= #0; exit;
end;
615