- •Лабораторная работа № 6
- •Лабораторная работа 7
- •1. Домашнее задание
- •Лабоаторная работа №8
- •Лабораторная работа № 9 Работа с массивами в среде программирования «Delphi»
- •1. Теоретическая часть Реакция на события от мыши и клавиатуры
- •Интерфейс Drag&Drop
- •2. Лабораторные задания и методические указания по их выполнению
- •Лабораторная работа № 10
- •1. Теоретическая часть
- •Доступ к файлам
- •Подпрограммы для работы с файлами
- •Текстовые файлы
- •Подпрограммы для работы с текстовыми файлами
- •Подпрограммы для работы с типизированными файлами
- •TOpenDialog и tSaveDialog
- •2. Лабораторные задания и методические указания по их выполнению
- •394026 Воронеж, Московский просп., 14
2. Лабораторные задания и методические указания по их выполнению
Рассмотрим один из вариантов программы для ввода двумерного массива с клавиатуры. Для этого на форме разместите два компонента класса Tlabel, два компонента класса TEdit и кнопку TBitBtn.
Среда "Delphi" по умолчанию присвоила этим компонентам имена "Form1", "Label1", "Label2" и т. д. Так как в программе может использоваться большое количество одинаковых компонентов, а наличие у них однотипных имен ("Label1", "Label2", "Edit1", "Edit2" и т. д.) затруднит понимание и написание программы, рекомендуется изменять названия на более индивидуальные, например, "Form_Lab1", "lbMassIn" и "lbResult". Имена в Delphi должны состоять из латинских букв, цифр и знака подчеркивания, причем имя не должно начинаться цифрой и содержать пробелов.
Изменим свойства формы следующим образом: в инспекторе объектов в "Caption" напишем "Лабораторная работа №2", в "BorderStyle" - " bsSingle", в "BorderIcons": "biSystemMenu" = "True", "biMinimize" = "True", "biMaximize" = "False", "biHelp" = "False". Полученная форма имеет заголовок "Лабораторная работа №2", ее размеры неизменяемы, ее можно закрыть нажав, на крестик в верхнем правом углу, и минимизировать.
С помощью TLabel создадим заголовки над редакторами. Для этого разместим их соответствующим образом, перейдем в инспектор объектов, и в их свойствах "Caption" напишем, например, следующее: "Введите массив" и "Результат". Для изменения шрифта в инспекторе объектов два раза щелкнем на свойстве "Font", установим высоту шрифта 10 и стиль fsBold.
П
28
Кнопка TBitBtn используется для выхода из программы. Присвоим ей имя "BtBnClose". В "Caption" запишем текст для вывода на кнопке, например, "Закрыть". Для того чтобы при нажатии кнопки завершалась работа программы необходимо сделать следующее: в инспекторе объектов перейти на страницу "Events" (события), выбрать пункт "OnClick" и два раза щелкнуть на нем мышью. В окне кода программы в появившийся текст новой процедуры вставить Close. Таким образом, при нажатии кнопки возникает событие "OnClick", оно обрабатывается написанной процедурой, метод формы Close закрывает окно и завершает работу программы.
procedure TForm1.BtBnCloseClick (Sender: TObject);
begin
Close;
end;
Как отмечалось выше, ввод массива будем осуществлять в редакторе edMassIn, элементы массива отделять пробелами, а строки - каким-нибудь символом, например, ";". Количество элементов в строках определяется
24
количеством элементов в первой строке, а строк - количеством разделителей + 1. Опишем в программе двумерный массив, например, mas_a размером 5х5, при этом нельзя будет вводить более 5 строк и 5 элементов в строке. После завершения ввода элементов нажимаем клавишу "Таб" или мышью выбираем edResult. При этом возникает событие "OnExit". Для создания процедуры обработки этого события перейдем в инспекторе объектов на страницу "Events" и два раза щелкнем мышью на "OnExit". В окне
кода программы появится заготовка процедуры, с которой и будем дальше работать.
procedure TForm1.edMassInExit (Sender: TObject);
var
i, j, len, sum1: integer;
b_st_i, e_st_i: integer; // начало и конец подстроки
n: integer; // номер строки
x: integer; // количество элементов в строке
first: boolean; // используем для определения кол-ва элементов
// первой подстроки
n_sim: integer;
begin
len:= Length(edMassIn.Text);
b_st_i:= 1;
n:= 1;
first:= True;
for i:=1 to len do
begin
if (edMassIn.Text[i] = ';') or (i = len) then
begin
e_st_i:= i; // конец подстроки
n_sim:= e_st_i - b_st_i; // количество символов в подстроке
if first then
begin // первая подстрока
x:= Conv(copy(edMassIn.Text, b_st_i, n_sim), n);
first:= False;
b_st_i:= e_st_i ; // определим начало новой подстроки
Inc(n); // переходим на новую строку
28
else // работаем не с первой подстрокой
begin
if x <> Conv(copy(edMassIn.Text, b_st_i+1, n_sim), n) then
begin
ShowMessage('Введенные строки имеют разное' +
' количество элементов. Строка: ' + IntToStr(n));
edMassIn.SetFocus; // возвращаемся в редактор
Exit;
end;
b_st_i:= e_st_i ; // определим начало новой подстроки
Inc(n); // переходим на новую строку
end;
end;
end; // конец цикла ввода
edResult.Text:= '';
sum1:= 0;
for i:= 1 to n-1 do // цикл по строкам
begin
for j:= 1 to x do // цикл по элементам строки
sum1:= sum1 + Mas_a[i, j];
edResult.Text:= edResult.Text + ' sum(' +IntToStr(i) + ') = '
+ IntToStr(sum1);
sum1:= 0;
end; end;
Процедуру TForm1.edMassInExit можно разделить на две части. В первой части выполняется ввод массива, а во второй – находятся суммы
25
элементов для каждой строки. Рассмотрим первую часть процедуры.
Определяем длину введенного текста и сохраняем ее в переменной len. В переменных b_st_i и e_st_i будем хранить соответственно начало и конец подстроки, в n - номер строки, x - количество элементов в строке. First используется как "защелка" для определения по первой строке количества элементов. Организуем цикл с первого по последний символ введенного текста, содержащегося в свойстве edMassIn.Text, и ищем символ-разделитель строк (";"). Если символ найден в переменную e_st_i записываем конец подстроки, т. е. номер символа-разделителя, и определяем длину подстроки (n_sim). Если это первая строка, т. е. first = True, то вызываем функцию Conv (функция подробно будет рассмотрена ниже). В нее передается текст подстроки и номер строки массива, а она возвращает количество элементов в строке. При обработке первой подстроки количество элементов в ней сохраняется в переменной x. First присваиваем значение False, конец первой подстроки делаем началом второй и переходим на новую строку массива.
Если first = False, то вызываем функцию Conv и сравниваем ее значение с количеством элементов в первой строке массива. При равенстве определяем начало следующей подстроки и переходим на новую строку массива. При неравенстве выдаем сообщение о различном количестве элементов в строках, указываем номер строки, методом SetFocus возвращаемся в редактор и выходим из процедуры.
Во второй части процедуры представлен пример обработки массива и вывода результатов в редактор TEdit. Обработка массива сводится к нахождению сумм элементов каждой строки. После нахождения сумма преобразуется в строку символов и записывается в свойство "Text" редактора edResult.
Работа функции Conv состоит в преобразовании символов переданной ей подстроки в последовательность чисел и последующей их записи в указанную строку массива. Переменная i_int - счетчик элементов строки массива, element - последовательность символов элемента строки массива.
function Conv (st: string; n: integer):integer;
var // st - текст подстроки; n - номер строки массива
i_st, i_int: integer;
element: string;
begin
element:= '';
i_int:= 1;
for i_st:=1 to Length(st) do
begin
if (st[i_st] <= '9') and (st[i_st] >= '0') then
element:= element + st[i_st]
if ((st[i_st] = ' ') or (i_st=Length(st))) and (element <> '') then
begin
Mas_a[n, i_int]:= StrToInt(element);
element:= '';
Inc(i_int);
end;
end;
Result:= i_int-1; // количество элементов
end;
{Выполняем преобразование не пустой переменной element в число при наличии разделительного пробела или обработке последнего символа
26
подстроки}
Следует отметить, что String - это цепочка следующих друг за другом символов Char. Каждый символ пронумерован, причем первый символ имеет номер 1. Программист может обращаться к любому символу строки, указывая его порядковый номер в квадратных скобках сразу за именем переменной.
О пределяем длину подстроки и организуем цикл с первого до последнего символа. Если символ - цифра, то записываем его в element. Если символ - пробел и element непустой, то element преобразуем в число и записываем его в строку n и номером в строке i_int массива mas_a. Затем очищаем element и увеличиваем i_int на 1.
Номер последнего преобразованного элемента строки массива записываем в результат функции. На рисунке 6 показан один из вариантов интерфейса программы
Рисунок 6 - Пример интерфейса программы
Задания.
1. Из процедуры edMassInExit сделать две процедуры. В первой выполнять ввод элементов массива с клавиатуры, а во второй - обработку массива и вывод результата в редактор edResult.
2. Вводить массив построчно, используя один редактор TEdit и кнопку. (Ввод строки происходит после нажатия кнопки.) Написать проверку количества введенных символов в строке.