Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
95.doc
Скачиваний:
6
Добавлен:
30.04.2022
Размер:
784.9 Кб
Скачать

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

рисвоим редакторам имена "edMassIn" и "edResult". В инспекторе объектов удалим текст, содержащийся в свойстве "Text". Редактор edResult будет использоваться только для вывода результатов. Можно запретить изменение в нем текста, для этого установим свойство "ReadOnly" "True".

Кнопка 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

end

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 и кнопку. (Ввод строки происходит после нажатия кнопки.) Написать проверку количества введенных символов в строке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]