- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

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); // переходим на новую строку

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 можно разделить на две части. В первой части выполняется ввод массива, а во второй – находятся суммы элементов для каждой строки. Рассмотрим первую часть процедуры.

Определяем длину введенного текста и сохраняем ее в переменной 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 в число при наличии разделительного пробела или обработке последнего символа подстроки}

Следует отметить, что String - это цепочка следующих друг за другом символов Char. Каждый символ пронумерован, причем первый символ имеет номер 1. Программист может обращаться к любому символу строки, указывая его порядковый номер в квадратных скобках сразу за именем переменной.

Определяем длину подстроки и организуем цикл с первого до последнего символа. Если символ - цифра, то записываем его в element. Если символ - пробел и element непустой, то element преобразуем в число и записываем его в строку n и номером в строке i_int массива mas_a. Затем очищаем element и увеличиваем i_int на 1. Номер последнего преобразованного элемента строки массива записываем в результат функции.

Поместите на форму два компонента TGroupBox, с именами GrBoxIn и GrBoxOut. На GrBoxIn установите три зависимых переключателя TRadioButton, а на GrBoxOut - два независимых переключателя TCheckBox. Переключателями TRadioButton можно будет выбрать источник данных (клавиатура, генератор случайных чисел или файл), а TCheckBox - вывод данных. Установите шрифт для GrBoxIn и GrBoxOut 10 размер, жирный; для TRadioButton и TCheckBox - 8 размер, обычный. Зависимые переключатели назовите RdBnKey, RdBnGen, RdBnFile и запишите в их свойства Caption соответственно Ввод с клавиатуры, Генератор случайных чисел и Получить данные из файла. Имена независимых переключателей укажите CkBoxEdit и CkBoxFile, а Caption соответственно Вывод данных на экран и Вывод данных в файл. Для RdBnKey и CkBoxEdit в Инспекторе Объектов свойство Checked установите в True. Т.о., при запуске программы эти переключатели окажутся выбранными по умолчанию.

На форму поместите кнопку TBitBtn, и назовите ее BtBnOpen, свойству Caption пропишите Открыть файл. Эту кнопку сделайте доступной при условии выбора зависимого переключателя в Получить данные из файла и недоступной при выборе другого варианта получения данных. Для этого в процедуре, обрабатывающей событие OnClick от RdBnFile, установите свойство Enabled кнопки BtBnOpen в True, а в Инспекторе Объектов и обработчиках события OnClick от RdBnKey и RdBnGen свойство Enabled=False. Для того, чтобы поле ввода элементов массива и вывода результатов очищались при выборе другого источника данных в соответствующих обработчиках OnClick вставте следующие строки edMassIn.Text:= '' и edResult.Text:= ''.

 

procedure TForm1.RdBnFileClick(Sender: TObject);

Begin

edMassIn.Text:= ''; // очистим редактор ввода

edResult.Text:= ''; // очистим редактор вывода

lbMassIn.Caption:= 'Данные из файла';

BtBnOpen.Enabled:= True;

end;

 

Для того чтобы поле для вывода результата edResult и его заголовок (метка lbResult) были доступны или нет в зависимости от переключателя CkBoxEdit в обработчике события OnClick выполните проверку свойства Checked. Если оно равно True, то установите свойство Enabled редактора и метки в True, иначе в False.

 

procedure TForm1.CkBoxEditClick(Sender: TObject);

Begin

If CkBoxEdit.Checked then

Begin

lbResult.Enabled:= True;

edResult.Enabled:= True;

End

Else

Begin

lbResult.Enabled:= False;

edResult.Enabled:= False;

end;

end;

 

Поместите на форму компонент TOpenDialog из страницы Dialogs. Вызов этого компонента будет происходить при нажатии на кнопку BtBnOpen. Установите фильтр файлов в свойстве Filter компонента OpenDialog. Далее необходимо реализовать следующий алгоритм – выполнить и проверить выполнение (Execute возвратит True или False) выбора файла. Затем функцией FileExists проверить существование файла, это необходимо сделать, чтобы избежать критической ошибки программы в случае ввода имени несуществующего файла. После успешного определения, имя файла связать с файловой переменной стандартной процедурой AssignFile и открыть файл для чтения процедурой Reset.

Исходные данные должны быть записаны в файл построчно, это позволит читать из файла сразу строку и после ее преобразования функцией Conv, описанной ранее, записать строкой в массив mas_a.

procedure TForm1.BtBnOpenClick(Sender: TObject);

Var

F: TextFile;

i, st_i: integer;

s: string;

Begin

i:= 1;

OpenDialog1.Filter:= 'Текстовые файлы|*.txt';

if not OpenDialog1.Execute then Exit;

If FileExists(OpenDialog1.FileName) then

Begin

AssignFile(F, OpenDialog1.FileName);

Reset(F);

While not Eof(F) do

Begin