- •Введение
- •1 Компоненты Delphi
- •1.1 Компонент класса TEdit
- •1.2 Компонент класса TLabel
- •1.3 Компонент класса TButton
- •1.4 Компонент класса TMemo
- •1.5 Компонент класса TStringGrid
- •1.6 Компонент класса TSpinEdit
- •2 Примеры выполнения практических заданий
- •2.1 Простейшие алгоритмы
- •2.2 Выражения
- •2.3 Циклы
- •2.4 Одномерные массивы
- •2.5 Матрицы
- •2.6 Строки
- •2.7 Записи и файлы
- •2.8 Функции и процедуры
min_i := 1; min_j := 1;
for i := 1 to Source_SG.RowCount do for j := 1 to Source_SG.ColCount do
if matr[min_i,min_j]>matr[i,j] then begin
min_i := i; min_j := j;
end;
{Вывод результатов} FindRow_E.Text := IntToStr(min_i); FindCol_E.Text := IntToStr(min_j);
end;
Внешний вид и пример работы программы показаны на рисунке 5.
Рисунок 5 – Внешний вид и пример работы программы, реализующей обработку матриц
2.6 Строки
Задание: Дана строка, состоящая из слов, разделенных пробелом. Сформировать одномерный массив, состоящий из слов данной строки.
Для решения поставленной задачи потребуются компоненты:
Source_E класса TEdit для ввода исходной строки;
Dest_M класса TMemo для вывода полученного массива слов;
Source_L класса TLabel для подписи компонента Source_E;
Dest_L класса TLabel для подписи компонента Dest_M;
Calc_B класса TButton для активизации расчета.
Установим следующие значения свойств компонентов (таблица 9):
20
Таблица 9 – Значения свойств компонентов для примера выполнения задания по работе со строками
Компонент.Свойство |
Значение |
Source_L.Caption |
&Исходная строка |
Source_L.FocusControl |
Source_E |
|
|
Dest_L.Caption |
Полученный массив &слов |
Dest_L.FocusControl |
Dest_M |
|
|
Dest_M.ReadOnly |
True |
Dest_M.ScrollBars |
ssVertical |
Calc_B.Caption |
Рас&чет |
Очистим свойство «Text» у компонента Source_E и свойство «Lines» у компонента Dest_M.
Опишем событие OnClick кнопки Calc_B:
procedure TForm1.Calc_BClick(Sender: TObject); var
s : string;
mas : array[1..100] of string; start,i,n : integer;
begin
{Получение исходной строки} s := Source_E.Text;
{Переменная start указывает на начала обрабатываемого слова.
Если ее значение равно "0", то никакое слово не обрабатывается}
start := 0;
{Установка начального количества слов в "0"} n := 0;
{Организация цикла по перебору символов строки} for i := 1 to Length(s) do
begin
if s[i]=' ' then // Текущий символ пробел begin
if start>0 then // Имеется текущее слово
begin |
|
inc(n); |
// Увеличение количества найденных слов |
mas[n] := Copy(s,start,i-start); // Копирование слова |
|
start := 0; |
// Текущих слов нет |
end; |
|
end |
|
else |
// Текущий символ не пробел |
if start=0 then |
// Текущих слов нет |
start := i; |
// Запоминание позиции текущего слова |
end; |
|
if start>0 then |
// Имеется текущее слово |
begin |
|
inc(n); |
// Увеличение количества найденных слов |
mas[n] := Copy(s,start,Length(s)-start+1); // Копирован. слова
21
end; |
|
{Вывод массива слов} |
|
Dest_M.Clear; |
// Очистка компонента вывода |
for i := 1 to n do
Dest_M.Lines.Add(mas[i]); // Добавление строк
end;
Внешний вид и пример работы программы показаны на рисунке 6.
Рисунок 6 – Внешний вид и пример работы программы, реализующей обработку строк
2.7 Записи и файлы
Задание: Картотека содержит данные о людях: фамилия, года рождения, количество детей. Составить программы, использующие для хранения данных о человеке тип «запись» и обеспечивающие:
а) ввод данных о людях и запись их в двоичный файл; б) чтение данных из файла, вывод прочитанных данных, а также данных
о человеке, имеющим наибольшее количество детей среди людей, родившихся позднее заданного года.
Будем считать, что максимальное количество людей – 100, заданный год лежит в диапазоне 1900÷2010, а начальное значение года – 1980. Примем в качестве имени файла для записи и чтения название «data.dat».
Для решения поставленной задачи потребуются компоненты:
Count_SE класса TSpinEdit для задания количества людей;
PeoplesSave_SG класса TStringGrid для ввода данных о людях;
Year_SE класса TSpinEdit для задания заданного года;
PeoplesLoad_SG класса TStringGrid для вывода считанных из файла
данных о людях;
22
Find_SG класса TStringGrid для вывода данных о найденном человеке;
Count_L класса TLabel для подписи компонента Count_SE;
PeoplesSave_L класса TLabel для подписи компонента
PeoplesSave_SG;
Year_L класса TLabel для подписи компонента Year_SE;
PeoplesLoad_L класса TLabel для подписи компонента
PeoplesLoad_SG;
Find_L класса TLabel для подписи компонента Find_SG;
Save_B класса TButton для активизации записи данных в файл;
Load_B класса TButton для активизации чтения данных из файла и вы-
полнения поиска человека.
Установим следующие значения свойств компонентов (таблица 10):
Таблица 10 – Значения свойств компонентов для примера выполнения задания по работе с записями и файлами
Компонент.Свойство |
Значение |
Count_L.Caption |
Количество &людей |
Count_L.FocusControl |
Count_SE |
|
|
Count_SE.MinValue |
1 |
Count_SE.MaxValue |
100 |
Count_SE.Value |
1 |
PeoplesSave_L.Caption |
С&писок людей для записи |
PeoplesSave_L.FocusControl |
PeoplesSave_SG |
PeoplesSave_SG.RowCount |
2 |
|
|
PeoplesSave_SG.ColCount |
3 |
|
|
PeoplesSave_SG.FixedCols |
0 |
PeoplesSave_SG.Options.goEditing |
True |
PeoplesSave_SG.Options.goAlwaysShowEditor |
True |
Year_L.Caption |
Заданный &год |
Year_L.FocusControl |
Year_SE |
Year_SE.MinValue |
1900 |
|
|
Year_SE.MaxValue |
2010 |
|
|
Year_SE.Value |
1980 |
PeoplesLoad_L.Caption |
С&читанный список людей |
PeoplesLoad_L.FocusControl |
PeoplesLoad_SG |
PeoplesLoad_SG.RowCount |
2 |
PeoplesLoad_SG.ColCount |
3 |
|
|
PeoplesLoad_SG.FixedCols |
0 |
|
|
Find_L.Caption |
На&йденный человек |
Find_L.FocusControl |
Find_SG |
|
|
Find_SG.RowCount |
2 |
Find_SG.ColCount |
3 |
Find_SG.FixedCols |
0 |
|
|
Save_B.Caption |
З&аписать |
Load_B.Caption |
П&рочитать и найти |
23
Так как заголовки столбцов таблиц должны быть отображены при запуске программы, но их невозможно задать через свойства компонентов, задание заголовков выполним в событии OnCreate формы:
procedure TMain_F.FormCreate(Sender: TObject); begin
PeoplesSave_SG.Cells[0,0] := 'Фамилия'; PeoplesSave_SG.Cells[1,0] := 'Год рождения'; PeoplesSave_SG.Cells[2,0] := 'К-во детей'; PeoplesLoad_SG.Cells[0,0] := 'Фамилия'; PeoplesLoad_SG.Cells[1,0] := 'Год рождения'; PeoplesLoad_SG.Cells[2,0] := 'К-во детей'; Find_SG.Cells[0,0] := 'Фамилия'; Find_SG.Cells[1,0] := 'Год рождения';
Find_SG.Cells[2,0] := 'К-во детей'; end;
Опишем событие OnChange компонента Count_SE:
procedure TMain_F.Count_SEChange(Sender: TObject); begin
{Количество строк должно быть на одну больше количества
людей, т.к. одна строка используется для заголовков}
PeoplesSave_SG.RowCount := Count_SE.Value+1; end;
Опишем тип данных для хранения информации об одном человеке. Тип данных может быть описан в разделе type секции implementation.
TPeople = record
LastName : ShortString; BirthYear,CountChild : integer;
end;
Опишем событие OnClick кнопки Save_B (программа «а)»):
procedure TMain_F.Save_BClick(Sender: TObject); var
people : TPeople; f : file;
i : integer; begin
{Создание и открытие файла для записи} AssignFile(f,'data.dat'); Rewrite(f,1);
{Запись данных о людях с использованием цикла. Цикл
начинается с "1" а не с "0", т.к. первая строка
содержит заголовки}
for i := 1 to PeoplesSave_SG.RowCount-1 do begin
{Получение данных о i-ом человеке}
24
people.LastName := PeoplesSave_SG.Cells[0,i]; people.BirthYear := StrToInt(PeoplesSave_SG.Cells[1,i]); people.CountChild := StrToInt(PeoplesSave_SG.Cells[2,i]); {Запись данных о i-ом человеке} blockwrite(f,people.LastName,SizeOf(people.LastName)); blockwrite(f,people.BirthYear,SizeOf(people.BirthYear)); blockwrite(f,people.CountChild,SizeOf(people.CountChild));
end;
CloseFile(f); // Закрытие файла end;
Опишем событие OnClick кнопки Load_B (программа «б)»):
procedure TMain_F.Load_BClick(Sender: TObject); var
peoples : array[1..100] of TPeople; f : file;
i,count,min_index : integer; begin
{Задание имени файла и открытие на чтение} AssignFile(f,'data.dat');
Reset(f,1);
{Начальное значение количества считанных данных - 0} count := 0;
{Организация цикла считывания данных.
Считывание осуществляется до конца файла} while not Eof(f) do
begin
{Увеличение количества считанных данных} inc(count);
{Считывание новых данных} blockread(f,peoples[count].LastName,
SizeOf(peoples[count].LastName));
blockread(f,peoples[count].BirthYear,
SizeOf(peoples[count].BirthYear));
blockread(f,peoples[count].CountChild,
SizeOf(peoples[count].CountChild));
end;
CloseFile(f); // Закрытие файла
{Установка количества строк в таблице для считанных данных} PeoplesLoad_SG.RowCount := count+1;
{Вывод считанных данных} for i := 1 to count do begin
PeoplesLoad_SG.Cells[0,i] := peoples[i].LastName; PeoplesLoad_SG.Cells[1,i] :=
IntToStr(peoples[i].BirthYear); PeoplesLoad_SG.Cells[2,i] :=
IntToStr(peoples[i].CountChild);
end;
{Будем считать, что значение min_index либо равно "0",
если ни одного человека не найдено, либо хранит номер
25