Зміст
Введення
1 Теоретичні відомості
2 Практична частина
2.1 Завдання
2.2 Лістинг програми
2.3 Екранні форми
Висновки
Література
Введення
Тема роботи В«Обробка одновимірних масивів в середовищі програмування LazarusВ»
Мета роботи: отримання практичних навичок створення віконних додатків для обробки одновимірних масивів в середовищі Lazarus.
Lazarus - вільна середу розробки програмного забезпечення для компілятора Free Pascal Compiler. Інтегроване середовище розробки надає можливість кроссплатформенной розробки додатків в Delphi-подібному оточенні.
На даний момент є єдиним інструментом, що дозволяє досить нескладно переносити Delphi-програми з графічним інтерфейсом в різні операційні системи: Linux, FreeBSD, Mac OS X, Microsoft Windows.
1 Теоретичні відомості
У середовищі Lazarus для введення масивів не передбачені ніякі спеціальні компоненти, тому можна використовувати компоненти Edit, Memo або будь-які інші, призначені для введення даних.
Можна вводити елементи у вікні по одному. У цьому випадку при одноразовому натисканні кнопки введення в обробнику подій повинні виконатися наступні оператори:
i: = i +1;
a [i]: = StrToInt (Edit1.Text);
Це означає, що натискання кнопки приводить до додавання одного елемента з вікна Edit в масив. При виконанні подальших дій по обробці масиву значення змінної i визначить кількість елементів масиву. Початкове значення i = 0 можна задати в розділі опису типізованих констант або в методі OnCreate для форми (див. нижче) і скидати його кожного разу при введенні нового масиву. У масив запишеться стільки елементів, скільки разів буде натиснута кнопка введення. Якщо не скидати значення i, то навіть після обробки масиву можна продовжити введення елементів в масив.
На малюнку 1 представлена ​​форма для введення елементів масиву.
Рисунок 1 - Форма програми для введення і виведення масиву
З кнопкою Button1 пов'язаний метод procedure Button1Click - ( Введення ). Метод edit 1. SetFocus встановлює фокус на рядку введення Edit1.
type
{TForm1}
TForm1 = class (TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
ListBox1: TListBox;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure Button3Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
private
{private declarations}
public
{public declarations}
end;
var
Form1: TForm1;
a: array [1 .. 20] of integer;
j, i, n: integer;
implementation
{TForm1}
procedure TForm1.FormCreate (Sender: TObject);
begin
i: = 0;
listBox1.Clear;
end;
procedure TForm1.Button1Click (Sender: TObject);
begin
edit1.SetFocus;
i: = i +1;
a [i]: = strToInt (edit1.text);
edit1.Clear;
end;
procedure TForm1.Button2Click (Sender: TObject);
begin
for j: = 1 to i do
listBox1.Items.Add (IntToStr (a [j]));
end;
procedure TForm1.Button3Click (Sender: TObject);
begin
i: = 0;
listBox1.Clear;
end;
initialization
{$ I unit2.lrs}
end.
На малюнку 2 представлений результат роботи програми.
Малюнок 2 - Результат роботи програми введення і виведення масиву
В компоненті Edit можна ввести відразу всі елементи масиву, розділяючи їх пробілами. Потрібно пам'ятати, що кількість прогалин-роздільників може бути будь-яким.
Цикл для пропуску пробілів між словами:
while (st [i] = ' ') And (i <= length (st)) do
inc (i);
Слова можна пропустити аналогічним циклом:
while (St [i] <> '') and (i <= length (st)) do
inc (i);
Ці два цикли повинні бути включені в зовнішній цикл, який закінчується тоді, коли закінчиться рядок.
Приклад виділення всіх слів рядки st:
i: = 1;
while i <= length (st) do
begin
while (st [i] = ' ') And (i <= length (st)) do
inc (i);
k: = i;
while (St [i] <> '') and (i <= length (st)) do
inc (i);
sl: = copy (st, k, i-k);
{обробка виділеного слова sl}
end;
На відміну від рядка введення, текстовий редактор Memo може містити будь кількість рядків. Його властивість text представляє собою рядок, складається з знаходяться в полі Memo рядків, розділених послідовністю символів з кодами 13 та 10 (кінець рядка і перехід на нову рядок). Ці символи в поле Memo при натисканні хто клав Enter. Для виділення підрядка, містить елемент масиву, потрібно знайти символ з кодом 13 (# 13), скопіювати в нову підрядок, а потім видалити її разом з кодами 13 і 10 і продовжити пошук кінця рядка.
У наведеному нижче фрагменті програми спочатку в рядок st записується вміст всього вікна memo1. Потім відшукується позиція кінця першого рядка (n) і цей рядок копіюється в st1 і видаляється з st. На малюнку 3 наведено результат роботи програми.
procedure TForm1.Button1Click (Sender: TObject);
var
st, st1: string;
n: integer;
begin
st: = memo1.Text;
n: = pos (# 13, st);
st1: = copy (st, 1, n-1);
label1.Caption: = 'Перший елемент =' + st1;
delete (st, 1, n +1);
ShowMessage ('решта елементів:' + # 13 + st);
end;
Рисунок 3 - Результат обробки memo . text
Наведений вище приклад не враховує тієї обставини, що будь-яка підрядок може містити будь-яку кількість прогалин. Їх потрібно видалити перед перетворенням рядка в число.
Функція GetLine повертає підрядок з номером n з рядка.
Function GetLine (s: string; n: integer): string;
var
p: integer;
begin
{видалити пробіли на початку рядка}
While (pos ('', s) = 1) and (length (s)> 0) do
delete (s, 1,1);
if n> 1 then
repeat
p: = pos (# 13, s);
if p <> 0 then
begin
s: = copy (s, p +2, length (s)-p);
While (pos ('', s) = 1) and (length (s)> 0) do
delete (s, 1,1);
n: = n-1;
end
until (n = 1) or (p = 0);
if n> 1 then result: =''
else
begin
p: = pos (# 13, s);
if p <> 0 then result: = copy (s, 1, p-1)
else result: = s;
end;
end;
procedure TForm1.Button1Click (Sender: TObject);
Var a: array [1 .. 10] of string [20];
i: integer;
st: string;
begin
For i: = 1 to k do
a [i]: = GetLine (Memo1.Text, i);
st: ='';
For i: = 1 to k do
st: = st + a [i] + # 13;
ShowMessage (st);
end;
Малюнок 4 - Результат роботи програми введення масиву
Для відображення на екрані списку значень в Lazarus призначений компонент ListBox . Цей компонент має в своєму складі об'єкт-список, що містить набір рядків з асоційованими з ними довільними об'єктами. Для того, щоб відобразити послідовно на екрані дані, які вводяться в рядок введення, можна виконати оператор ListBox1.Items.Add (E...