Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 icon

Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3




Скачати 263.28 Kb.
НазваЛекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3
Дата конвертації26.01.2013
Розмір263.28 Kb.
ТипЛекція

Лекція №4

Тема: Програмування на Object Delphi: масиви

План

1 Одновимірні масиви 1

1.1 Оголошення масиву 1

1.2 Виведення масиву 2

1.3 Введення масиву 3

1.4 Використання компоненту StringGrid 3

1.5 Використання компоненту Memo 7

2 Багатовимірні масиви 9

3 Помилки при використанні масивів 13

Література 15


Масив – це структура даних, доступ до елементів якої здійснюється по номеру індексу. Всі елементи масиву мають один тип.

1 Одновимірні масиви

1.1 Оголошення масиву


Масив, як і будь-яка змінна програми, перед використанням повинен бути оголошений в розділі оголошення змінних. У загальному вигляді інструкція оголошення масиву виглядає таким чином:

Ім'я: array [нижній індекс. . верхній індекс] of тип

де:

- ім'я - ім'я масиву;

- array - зарезервоване слово мови Delphi, що позначає, що оголошуване ім'я є ім'ям масиву;

- нижній індекс і верхній індекс - цілі константи, що визначають діапазон зміни індексу елементів масиву і, неявно, кількість елементів (розмір) масиву;

- тип - тип елементів масиву.


Приклади оголошення масивів:

temper:array[1..31] of real;

коef:array[0. .2] of integer;

name:array[1..30] of string[25];

При оголошенні масиву зручно використовувати іменовані константи. Іменована константа оголошується в розділі оголошення констант, який звичайно розташовують перед розділом оголошення змінних. Починається розділ оголошення констант словом const. У інструкції оголошення іменованої константи указують ім'я константи і її значення, яке відділяється від імені символом "рівно". Наприклад, щоб оголосити іменовану константу нв, значення якої рівне 10, в розділ const треба записати інструкцію: нв=10. Після оголошення іменованої константи її можна використовувати в програмі як звичайну числову або символьну константу. Нижче як приклад приведено оголошення масиву назв команд-учасниць чемпіонату по футболу, в якому використовуються іменовані константи.

const

NT = 18; // число команд

SN = 25; // гранична довжина назви команди var

team: array[1..NT] of string[SN];

Для того, щоб в програмі використовувати елемент масиву, треба вказати ім'я масиву і номер елементу (індекс), уклавши індекс в квадратні дужки. Як індекс можна використовувати константу або вираз цілого типа, наприклад:

team [ 1] := 'Зеніт';

d := koef[l]*koef[l]-4*koef[2]*koef[1];

ShowMessage(name[n+1]);

temper[i]:= StrToFloat(Edit1.text);

Якщо масив не є локальним, тобто оголошений не в процедурі обробки події, а в розділі змінних модуля, то одночасно з оголошенням масиву можна виконати його ініціалізацію, тобто привласнити початкові значення елементам масиву. Інструкція оголошення масиву з одночасною його ініціалізацією в загальному вигляді виглядає так:

Ім'я :array [нижній індекс. . верхній індекс] of тип = (список);


- де список - розділені комами значення елементів масиву. Наприклад:

а: array[10] of integer = (0,0,0,0,0,0,0,0,0,0);

Team: array[1..5] of String[10]= ('Зенит','Динамо','Спартак','Ротор','СКА');

Зверніть увагу, що кількість елементів списку ініціалізації повинна відповідати розмірності масиву. Якщо це буде не так, то компілятор виведе повідомлення про помилку: Number of elements differs from declaration (кількість елементів не відповідає вказаному в оголошенні).

При спробі ініціалізувати локальний масив компілятор виводить повідомлення про помилку: Cannot initialize local variables (локальна змінна не може ініціалізувати). Локальний масив можна ініціалізувати тільки під час роботи програми, наприклад, так:

for i := 1 to 10 do

а[i]:= 0;

1.2 Виведення масиву


Під виведенням масиву розуміється висновок на екран монітора (у діалогове вікно) значень елементів масиву.

Якщо в програмі необхідно вивести значення всіх елементів масиву, то для цього зручно використовувати інструкцію for, при цьому змінна-лічильник інструкції for може бути використана як індекс елементу масиву.

Як приклад на рис.1 приведено діалогове вікно застосування, яке демонструє ініціалізацію і процес виведення значень елементів масиву в полі мітки. Програма виводить пронумерований список футбольних команд. Слід звернути увагу, що для того, щоб список команд виглядав дійсно як список, властивості Label1.AutoSize потрібно привласнити значення False (привласніть властивості Label1.AutoSize значення True і подивитеся, як працюватиме програма). Текст програми приведений в лістингу 1.



Рисунок 1 Форму і діалогове вікно застосування Виведення масиву


Лістинг 1. Ініціалізація і виведення масиву


unit outar_;

interface

uses

Windows, Messages, SysUtils, Variants

Classes, Graphics, Controls, Forms

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } end;

var

Form1: TForm1;

implementation

($R *.dfm}

const

NT = 5;

var

team: array[1..NT] of string[10]=('Зенит','Динамо','Ротор','Спартак','СКА');

procedure TForml.ButtonlClick(Sender: TObject);

var

st:string; // список команд

i:integer; // індекс, номер елементу масиву

begin

// формування списку для відображення у формі

for i:=l to NT do st := st + IntToStr(i)+ ' ' + team[i]+ #13; // виведення списку Label1.Caption := st;

end;

end.

1.3 Введення масиву


Під введенням масиву розуміється процес отримання від користувача (або з файлу) під час роботи програми значень елементів масиву.

"Лобове" рішення задачі введення елементів масиву - для кожного елементу масиву створити поле введення. Проте якщо потрібно ввести достатньо великий масив, то таке рішення неприйнятно. Представте форму, наприклад, з десятьма полями редагування!

Очевидно, що послідовність чисел зручно вводити в рядок таблиці, де кожне число знаходиться в окремому осередку. Нижче розглядаються два варіанти організації введення масиву з використанням компонентів StringGrid І Memo.

1.4 Використання компоненту StringGrid


Для введення масиву зручно використовувати компонент StringGrid. Значок компоненту StringGrid знаходиться на вкладці Additional (рис. 2).



Рисунок 2 Компонент StringGrid


Компонент StringGrid є таблицею, осередки якої містять рядки символів. У табл. 1 перераховані деякі властивості компоненту StringGrid.


Таблиця 1. Властивості компоненту StringGrid

Властивість

Визначає

Name

Ім'я компоненту. Використовується в програмі для доступу до властивостей компоненту

Властивість

Визначає

ColCount

Кількість колонок таблиці

RowCount

Кількість рядків таблиці

Cells

Відповідний таблиці двовимірний масив. Елемент таблиці, що знаходиться на перетині стовпця номер col і рядки номер row визначається елементом cells [col, row]

FixedCols

Кількість зафіксованих зліва колонок таблиці. Зафіксовані колонки виділяються кольором і при горизонтальній прокрутці таблиці залишаються на місці

FixedRows

Кількість зафіксованих зверху рядків таблиці. Зафіксовані рядки виділяються кольором і при вертикальній прокрутці таблиці залишаються на місці

Options . goEditing

Ознака допустимості редагування вмісту елементів таблиці. True - редагування дозволене, False - заборонено

Options . goTab

Вирішує (True) або забороняє (False) використання клавіші <Таb> для переміщення курсора в наступний елемент таблиці

Options . GoAlways-ShowEditor

Ознака знаходження компоненту в режимі редагування. Якщо значення властивості False, то для того, щоб в осередку з'явився курсор, треба почати набирати текст, натиснути клавішу або зробити клацання мишею

DefaultColWidth

Ширину колонок таблиці

DefaultRowHeight

Висоту рядків таблиці

GridLineWi-dth

Ширину ліній, що обмежують елементи таблиці

Left

Відстань від лівої межі поля таблиці до лівої межі форми

Top

Відстань від верхньої межі поля таблиці до верхньої межі форми

Height

Висоту поля таблиці

Width

Ширину поля таблиці

Font

Шрифт, використовуваний для відображення вмісту елементів таблиці

ParentFont

Ознака спадкоємства характеристик шрифту форми


Приклад. Як приклад використання компоненту stringGrid для введення масиву розглянемо програму, яка обчислює середнє арифметичне значення елементів масиву. Діалогове вікно програми приведене на рис.3. Компонент stringGrid використовується для введення масиву, компоненти Label1 і Label2 - для виведення тексту, пояснення, і результату розрахунку Button1 - для запуску процесу розрахунку.



Рисунок 3 Діалогове вікно програми Введення і обробка масиву


Додається компонент stringGrid у форму точно так, як і інші компоненти. Після додавання компоненту до форми потрібно виконати його настройку табл. 2. Значення властивостей Height і width слідує за допомогою миші встановити такими, щоб розмір компоненту був рівний розміру рядка.

Текст програми приведений в лістингу.


Таблиця 2 Значення властивостей компоненту StringGrid1

Властивість

Значення

ColCount

5

FixedCols

0

RowCount

1

DefaultRowHeight

24

Height

24

DefaultColWidth

64

Width

328

Options . goEditing

True – можливість вводити з клавіатури дані

Options . AlwaysShowEditing

True – можливість редагувати осередок

Options .goTabs

True – можливість пересуватися між осередками за допомогою кнопки «Tab»


Лістинг 2. Введення і обробка масиву цілих чисел

unit getar_;

interface

uses

Windows, Messages, SysUtils, Variants

Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

StringGridl: TStringGrid;

Button1: TButton;

Label2: TLabel;

procedure ButtonlClick(Sender: TObject); private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForml ;

implementation

{$R *.dfm}

procedure TForml.ButtonlClick(Sender: TObject);

var

а : array[1..5] of integer; // масив

summ: integer; // сума елементів

sr: real; // середнє арифметичне

i: integer; // індекс

begin

// введення масиву

// вважаємо, що якщо осередок порожній, то відповідний

// нею елемент масиву рівний нулю

for i:= 1 to 5 do

if Length(StringGridl.Cells[i-1, 0])<>0

then а[i]:= StrToInt(StringGridl.Cells[i-1,0])

else а[i]:= 0;

// обробка масиву

summ := 0;

for i :=1 to 5 do

summ := summ + а[i]; sr := summ / 5;

//У виведення результату

Label2.Caption :='Сумма елементів: ' + IntToStr(summ)+ #13+ 'Середнє Арифметичне: ' + FloatToStr(sr);

end;

end.


Після пробних запусків програми виникає бажання внести зміни в процес введення масиву. Так, було б непогано, щоб курсор автоматично переходив в наступний елемент таблиці, наприклад, в результаті натиснення клавіші . Зробити це можна за допомогою процедури обробки події onKeyPress. На цю ж процедуру можна покласти завдання фільтрації даних, що вводяться в елемент таблиці. У нашому випадку треба вирішити введення в осередок тільки цифр.

Текст процедури обробки події OnKeyPress приведений в лістингу. Слід звернути увагу на властивість Col, яка під час роботи програми містить номер колонки таблиці, в якій знаходиться курсор. Цю властивість можна також використовувати для переміщення курсору в потрібний елемент таблиці. Проте потрібно враховувати, що колонки таблиці, втім, як і рядки, нумеруються з нуля.


Лістинг 3. Процедура обробки події OnKeyPress

procedure TForm1.StringGridlKeyPress(Sender: TObject;

var Key: Char);

begin

case Key of

#8,'0'..'9' : ; // цифри і клавіша

#13: // клавіша

if StringGridl.Col < StringGridl.ColCount — 1

then StringGridl.Col := StringGridl.Col + 1;

else key := Chr(0); // решта символів заборонена

end;

end;


Якщо потрібно ввести масив дробових чисел (а: array [1. .5] of real), то процедура обробки події OnKeyPress дещо ускладниться, оскільки крім цифр допустимими символами є символ-роздільник (кома або крапка — залежить від настройки Windows) і мінус. З метою забезпечення деякої дружності програми по відношенню до користувача можна застосувати трюк: підмінити невірний роздільник, що вводиться користувачем, вірним. Визначити, який символ-роздільник допустимий в поточній настройці Windows, можна, звернувшись до глобальної змінної Decimaiseparator.

У лістингу 4 приведений текст модуля застосування введення і обробки масиву дробових чисел. Процедура обробки події OnKeyPress забезпечує введення в елемент таблиці тільки допустимих при записі дробового числа символів.

Лістинг 4. Введення і обробка масиву дробових чисел

unit. getar_1; interface

uses


Windows, Messages, SysUtils, Variants, Classes

Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type

TForm1= class(TForm)

Label1: TLabel;

StringGrid1: TStringGrid;

Button1: TButton;

Label2: TLabel;

procedure Button1ClicktSender: TObject);

procedure StringGridlKeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonlClick(Sender: TObject);

var

а : array[1..5] of real; // масив

suram: real; // сума елементів

sr: real; // середнє арифметичне

i: integer; // індекс

begin

// введення масиву

// вважаємо, що якщо осередок порожній, то відповідний

// нею елемент масиву рівний нулю

for i:= 1 to 5 do

if Length(StringGridl.Cells[i-l,0])<>0

then а[i]:= StrToFloat(StringGridl.Cells[i-1, 0]) else а[i]:= 0;

// обробка масиву

summ := 0;

for i :=1 to 5 do

summ := summ + а[i]; sr := summ / 5;

// виведення результату

Label2.Caption :=

'Сума елементів: ' + FloatToStr(summ)

+ #13+ 'Середнє Арифметичне: ' + FloatToStr(sr); end;

'/ Функція забезпечує введення в осередок тільки допустимих символів

procedure TForm1.StringGridlKeyPress(Sender: TObject; var Key: Char);

begin

case Key of

#8,'0'..'9' : ; // цифри і

#13: // клавіша

if StringGridl.Col < StringGridl.ColCount - 1

then StringGridl.Col := StringGridl.Col + 1; '.',',':

// роздільник цілої і дробової частин числа

begin

if Key <> DecimalSeparator then

Key := DecimalSeparator; // замінимо роздільник

// на допустимий

if Pos(StringGridl.Cells[StringGridl.Col,0],

DecimalSeparator) <> 0

then Key := Chr(O); // заборона введення другого

// роздільника end;

' -' : // мінус можна ввести тільки першим символом

// тобто коли осередок порожній

if Length(StringGrid1.Cells[StringGrid1.Col, 0])<>0 then

Key := Chr(0);

else // решта символів заборонена

key := Chr(0);

end;

end;

end.

1.5 Використання компоненту Memo


В деяких випадках для введення масиву можна використовувати компонент Memo. Компонент Memo дозволяє вводити текст, що складається з достатньо великої кількості рядків, тому його зручно використовувати для введення символьного масиву. Компонент Memo додається у форму звичайним способом. Значок компоненту знаходиться на вкладці Standard (рис. 4).



Рисунок 4 Компонент Memo


У табл. 3 перераховані деякі властивості компоненту Memo.


Таблиця 3 Властивості компоненту Memo

Властивість

Визначає

Name

Ім'я компоненту. Використовується в програмі для доступу до властивостей компоненту

Text

Текст, що знаходиться в полі Memo. Розглядається як єдине ціле

Lines

Текст, що знаходиться в полі Memo. Розглядається як сукупність рядків. Доступ до рядка здійснюється по номеру

Lines .Count

Кількість рядків тексту в полі Memo

Left

Відстань від лівої межі поля до лівої межі форми

Top

Відстань від верхньої межі поля до верхньої межі форми

Height

Висоту поля

Width

Ширину поля

Font

Шрифт, використовуваний для відображення тексту, що вводиться

ParentFont

Ознака спадкоємства властивостей шрифту батьківської форми


При використанні компоненту Memo для введення масиву значення кожного елементу масиву слід вводити в окремому рядку і після введення кожного елементу масиву натискати клавішу .

Дістати доступ до Memo рядка тексту, що знаходиться в полі, можна за допомогою властивості Lines, вказавши в квадратних дужках номер потрібного рядка (рядки нумеруються з нуля).


Приклад Наступна програма, текст якої приведений в лістингу, демонструє використання компоненту Memo для введення символьного масиву.

Основний цикл процедури введення символьного масиву з компоненту Memo може виглядати так:

for i:=l to SIZE do

а [ i ]:= Memol.Lines[i];

де:

- SIZE - іменована константа, що визначає розмір масиву;

- а - масив;

- Memo - ім'я Memo-компоненту;

- Lines - властивість компоненту Memo, що є масивом, кожен елемент якого містить один рядок Memo тексту, що знаходиться в полі.

Форма програми приведена на рис. 5. Крім поля Memo вона містить командну кнопку (Buttonl), при клацанні на якій виконується введення значень елементів масиву з поля Memo.



Рисунок 5 Діалогове вікно застосування Введення масиву


Лістинг 5. Введення масиву рядків з компоненту Memo

unit fr_memo_; interface

uses

Windows, Messages, SysUtils, Classes

Graphics, Controls, Forms, Dialogs, Menus, StdCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Button1: TButton;

Label1: TLabel;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Forml: TForm1;

implementation

($R *.DFM}

procedure TForml .ButtonlClick(Sender: TObject);

const

SIZE=5; // розмір масиву var

a:array[l..SIZE]of string[30]; //массив

n: integer; // кількість рядків, введених в поле Memo

i:integer; // індекс елементу масиву

st:string;

begin

n:=Memo1.Lines.Count;

if n = 0 then begin

ShowMessage('Початкові дані не введені!');

Exit; // вихід з процедури обробки події

end;

// у полі Memo є текст

if n > SIZE then begin

ShowMessage('Кількість рядків перевищує розмір масиву.');


n:=SIZE; // вводитимемо тільки перші SIZE рядків

end;

for i:=1 to n do

а[i]:=Form1.Memol.Lines[i-1]; // рядки Memo пронумеровані з нуля

// виведення масиву у вікно повідомлення

if n > 0 then begin

st:='Введенный масив:'+#13;

for i: =1 to n do

st:=st+IntToStr(i)+' '+ а[i]+f13; ShowMessage(st);

end;

end;

end.

Основну роботу виконує процедура TForm1.Button1Click, яка спочатку перевіряє, чи є в полі Memo1 текст. Якщо текст є (в цьому випадку значення властивості Lines.Count більше нуля), то процедура порівнює кількість введених рядків і розмір масиву. Якщо ця кількість перевищує розмір масиву, то програма змінює значення п, тим самим готує введення тільки перших SIZE рядків.

На мал. 6 приведений вид діалогового вікна застосування Введення масиву. Після клацання на командній кнопці Введення з'являється вікно (рис. 7), яке містить значення елементів масиву, одержані з Memo-поля.



Рисунок 6 Вікно застосування Рисунок 7 Масив, введений

Введення масиву з Memo-поля

2 Багатовимірні масиви


У повсякденному житті досить часто доводиться мати справу з інформацією, яка представлена в табличній формі. Наприклад, результат діяльності деякої фірми, торгуючої автомобілями, може бути представлений у вигляді табл. 4.


Таблиця 4




Січень

Лютий

Березень

...

Листопад

Грудень

ВA3 2106



















ВA3 2107



















ВA3 2108



















ВA3 2109



















ВАЗ 2110



















ВАЗ 2111




















Колонки і (або) рядки таблиці, як правило, складаються з однорідної інформації. Тому в програмі, оброблювальній табличні дані, має сенс використовувати масиви для зберігання і обробки таблиць. Так, приведена вище таблиця може бути представлена як сукупність одновимірних масивів:

vaz2106: array [1..12] of integer;

vaz2107: array [1..12] of integer;

vaz2108: array [1..12] of integer;

vaz2109: array [1..12] of integer;

vaz2110: array [1..12] of integer;

vaz2111: array [1..12] of integer;

Кожний з приведених масивів може зберігати інформацію про кількість проданих автомобілів однієї марки, причому значення елементу масиву відображає кількість проданих машин у відповідному місяці.

Можливо і таке представлення таблиці:

jan: array [1..6] of integer;

feb: array [1..6] of integer;

mar: array [1..6] of integer;

dec: array [1..6] of integer;

В цьому випадку кожен масив призначений для зберігання інформації про кількість проданих за місяць автомобілів, причому значення елементу масиву відображає продану кількість автомобілів однієї марки.

Якщо вся таблиця містить однорідну інформацію, наприклад, тільки цілі числа, то така таблиця може бути представлена як двовимірний масив.

У загальному вигляді інструкція оголошення двовимірного масиву виглядає так:

Ім'я: array[ Нижняя Межа1..Верхняя Межа 1; Нижняя Межа 2..Верхняя Межа 2] of Тип

де:

- Ім'я - ім'я масиву;

- array - слово мови Delphi, вказуючи, що оголошуваний елемент даних є масивом;

- НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 - цілі константи, що визначають діапазон зміни індексів і, отже, число елементів масиву;

- Тип - тип елементів масиву.

Табл. 7 може бути представлена у вигляді двовимірного масиву таким чином:

itog: array [1..12, 1..6] of integer

Кількість елементів двовимірного масиву можна обчислити за формулою:

(ВМ1-НМ1+1) х (ВМ2-НМ2+1):

де:

- ВМ1 і ВМ2 - верхня межа першого і другого індексів;

- НМ1 і НМ2 - нижня межа першого і другого індексів. Таким чином, масив itog складається з 60 елементів типу integer.

Для того, щоб використовувати елемент масиву, потрібно вказати ім'я масиву і індекси елементу. Перший індекс звичайно відповідає номеру рядка таблиці, другої - номеру колонки. Так, елемент itog [2,3] містить число проданих в березні (третій місяць) автомобілів марки ВАЗ 2107 (дані про продаж ВАЗ 2107 знаходяться в другому рядку таблиці).

При роботі з таблицями (масивами) зручно використовувати інструкцію for. Наприклад, фрагмент програми, що обчислює кількість проданих за рік автомобілів одного найменування, виглядає так:

s := 0;

for j := 1 to 12 do

s := s + itog[2,j];

Наступний фрагмент програми обчислює суму елементів масиву (загальна кількість автомобілів, проданих за рік).

s:=0;

for i := 1 to 6 do // шість моделей автомобілів

for j := 1 to 12 do //12 місяців s := s + itog[i,j];

У приведеному фрагменті програми кожного разу, коли внутрішній цикл (цикл по j) завершується, в зовнішньому циклі значення i збільшується на одиницю і внутрішній цикл виконується знов. Таким чином, до поточного значення змінної s послідовно додаються значення елементів масиву itog: itog[l,l], itog[l,2], ..., itog[l,12], itog[2,l], itog[2,2], ..., itog[2,12] і т.д.

Приклад. Як приклад розглянемо програму, яка обробляє результати спортивних змагань літньої олімпіади в Сіднеї, 2000 р. Початкові дані представлені табл. 5.


Таблиця 5 Результати олімпіади 2000 р. в Сіднеї

Країна

Золотих

Срібних

Бронзових

Австралія

16

25

17

Білорусь

3

3

11

Великобританія

11

10

7

Німеччина

14

17

26

Італія

13

8

13

Китай

28

16

15

Корея

8

9

11

Куба

11

11

7

Нідерланди

12

9

4

Росія

32

28

28

Румунія

11

6

9

США

39

25

33

Франція

13

14

11

Японія

5

8

5


Програма повинна обчислити загальну кількість медалей, завойованих представниками кожної країни, і відповідну кількість очок (балів), яка обчислюється за наступним правилом: за кожну золоту медаль команда одержує сім очок, за срібну — шість очок, за бронзову — п'ять очок.

Вид діалогового вікна програми приведений на рис. 8.



Рисунок 8 Діалогове вікно програми Підсумки олімпіади


Для введення початкових даних і відображення результату використовується компонент StringGrid, властивості якого приведені табл. 6.


Таблиця 6 Значення властивості компоненту StringGrid1

Властивість

Значення

Name

Tab1

ColCount

6

RowCount

14

FixedCols

0

FixedRows

1

Options . goEditing

TRUE

DefaultColWidth

65

DefaultRowHeight

14

GridLineWidth

1

Осередки першого зафіксованого рядка таблиці використовуються як заголовки колонок таблиці. Під час створення форми застосування не можна встановити значення елементів масиву cells, оскільки елементи масиву доступні тільки під час роботи програми. Тому значення елементів масиву Сells, відповідних першому рядку таблиці, встановлює процедура обробки події OnActivate (її текст приведений в лістингу 6), яка відбувається під час активізації форми застосування. Крім того, ця процедура вписує в першу колонку таблиці назви країн-учасниць змагань.

Лістинг 6. Ініціалізація таблиці

procedure TForml.FormActivate(Sender: TObject); begin

tabl.Cells[0,0] :='Страна';

tabl.Cells[1,0] :='Золотых';

tabl.Cells[2,0] :='Серебряных';

tabl.Cells[3,0] :='Бронзовых';

tabl.Cells[4,0] :='Bcero';

tabl.Cells[5,0] :='Баллов';

tabl.Cells[0,1] :='Австралия';

tabl.Cells[0,2] :='Белоруссия';

tabl.Cells[0,3]: ='Великобритания';

tabl.Cells[0,4] :='Германия';

tabl.Cells[0,5] :='Италия';

tabl.Cells[0,6] :='Китай';

tabl.Cells[0,7] :='Корея';

tabl.Cells[0,8] :='Куба';

tabl.Cells[0,9] :='Нидерланды';

tabl.Cells[0,10]:= 'Росія';

tabl.Cells[0,ll]:='США';

tabl,Cells[0,12]:='Франция';

tabl.Cells[0,13]:='Япония'; end;


Програма обробки початкової таблиці (лістинг) запускається клацанням миші на командній кнопці Підсумки (Buttoni).

Лістинг 7. Обробка двовимірного масиву

procedure TForml.ButtonlClick(Sender: TObject);

var

с,r:integer; // номер колонки і рядка таблиці

s:integer; // всього медалей у команди

р:integer; // окулярів у команди

m:integer; // номер рядка з максимальною кількістю очок

buf:array[0..5] of string; // буфер для обміну рядків

i:integer; // номер рядка. Використовується під час сортування

begin

for r:=l to tab1.rowcount do // обробити всі рядки

begin s:=0;

// обчислюємо загальну к-ть медалей

for c:=l to 3 do

if tabl.cells[с,r] <>''

then s:=s+StrToInt(tab1.cells[с,r])

else tabl.cells[с,r]:='0'; // обчислюємо кількість очок

p:=7*StrToInt(tab1.cells[l,r])+

6*StrToInt(tabl.cells[2, r] )

+ 5*StrToInt(tabl.cells[3,r]};

// виведення результату

tabl.cells[4,r]:=IntToStr(s); // всього медалей

tabl.cells[5,r]:=IntToStr(p); // окулярів

end;

// сортування таблиці по убуванню у відповідності

// з кількістю балів (по вмісту 5-го стовпця)

// сортування методом вибору

for r:=l to tab1.rowcount-1 do

begin

m:=r; // максимальний елемент — в r-й рядку

for i:=r to tabl.rowcount-1 do

if StrToInt(tabl.cells[5,i])>StrToInt(tabl.cells[5,m])

then m:=i;

if r <> m then

begin // обміняємо г-ю і m-ю рядки таблиці

for c:=0 to 5 do begin

buf[с]:=tab1.Cells[с,r];

tab1.Cells[с,r]:=tabl.Cells[с,m];

tab1.Cells[с,m]:=buf[c];

end;

end;

end;

end;


Спочатку для кожної країни програма обчислює загальну кількість медалей і відповідну кількість очок. Потім, використовуючи метод простого вибору, програма виконує сортування таблиці по убуванню кількості набраних очок. Під час сортування для обміну рядків таблиці використовується строковий масив buf, індекс якого, як і індекс стовпця таблиці, міняється від нуля до п'яти (див. інструкцію оголошення масиву в тексті програми). Такий прийом дозволяє найпростіше виконати копіювання рядка, що заміщається, в буфер і заміщення рядка вмістом буфера.


На рис. 9 приведене діалогове вікно програми після завершення процесу обробки масиву.



Рисунок 9 Вікно програми Підсумки олімпіади

3 Помилки при використанні масивів


При використанні масивів найбільш поширеною помилкою є вихід значення індексного виразу за допустимі межі, вказані при оголошенні масиву.

Якщо як індекс використовується константа, і її значення виходить за допустимі межі, то така помилка виявляється на етапі компіляції програми. Наприклад, якщо в програмі оголошений масив

day : array[0..6] of string[ll]

то під час компіляції програми інструкція

day [7] := 'Неділя';

буде помічена як помилкова.

Якщо для доступу до елементу масиву як індекс використовується змінна або вираз, то можливо виникнення помилки (виключення) часу виконання програми. Наприклад, якщо в програмі оголошений масив

tab1: array [1..N] of integer;

то інструкція

for i:=0 to N do tab1[i] := 5;

формально є вірною, і її компіляція буде успішно виконана.

Проте під час виконання програми, при спробі привласнити значення неіснуючому нульовому елементу масиву tab, на екран буде виведене повідомлення про помилку. Вид вікна і текст повідомлення залежить від того, звідки запущена програма.

При запуску даної програми з Delphi виникає виключення, і повідомлення має вигляд, приведений на мал. 10.



Рисунок 10 Повідомлення про помилку при зверненні до неіснуючого елементу масиву (програма запущена з Delphi)


Якщо програма запущена з Windows, то при спробі привласнити значення неіснуючому елементу масиву на екран буде виведене повідомлення Range check error (помилка контролю діапазону). У заголовку вікна буде вказане ім'я застосування, в процесі виконання якого відбулася помилка (мал. 11).



Рисунок 11 Повідомлення про помилку при зверненні до неіснуючого елементу масиву (програма запущена з Windows)


Поведінка програми при виході індексного виразу за межі діапазону допустимих значень визначається настройкою компілятора.

Для того, щоб програма контролювала значення індексних виразів (в цьому випадку Delphi додає у виконувану програму інструкції, що забезпечують цей контроль), необхідно на вкладці Compiler діалогового вікна Project Options, яке відкривається вибором з меню Project команди Options, встановити прапорець Range checking (Контроль діапазону), що знаходиться в групі Runtime errors (Помилки часу виконання) (мал. 12).

Поведінка програми при виході індексного виразу за межі діапазону допустимих значень визначається настройкою компілятора.

Для того, щоб програма контролювала значення індексних виразів (в цьому випадку Delphi додає у виконувану програму інструкції, що забезпечують цей контроль), необхідно на вкладці Compiler діалогового вікна Project Options, яке відкривається вибором з меню Project команди Options, встановити прапорець Range checking (Контроль діапазону), що знаходиться в групі Runtime errors (Помилки часу виконання) (рис. 12).



Рисунок 12 Вкладка Compiler діалогового вікна Project Options


Контрольні питання



  1. Які типи даних відносяться до складних?

  2. Які змінні називаються структурованими?

  3. Як класифікуються типи даних, що використовуються в Object Pascal?

  4. Що таке масив? Наведіть приклади.

  5. Наведіть приклади структури масиву.

  6. Що таке індексна змінна масиву?

  7. Як визначити n- вимірність масиву?

  8. Наведіть графічну структуру дво - та тривимірного масиву.

  9. Як розміщуються елементи матриці у пам'яті ЕОМ?

  10. Як та в яких розділах описується масив?

  11. Чому введення типу масиву спрощує налагодження програми?

  12. Що значить «ввести масив у комп'ютер»?

  13. Як ввести одновимірний масив з використанням компонен­та форми Edit?

  14. Утворіть діалогове вікно «Ввід одновимірного масиву».

  15. Що означає цей фрагмент?
    for i:=l to n do

а[і]:=Memol.Lines[і-1]

  1. Як Ви розумієте цей запис? n:=Memol.Lines.Count;

  2. В якому розділі програм та як саме слід оголошувати масив?

  3. Які масиви називаються багатовимірними?

  4. Для чого використовується зарезервоване слово packed Object Pascal-програми?

  5. Що таке динамічні масиви Delphi 6?

  6. Як оголошують динамічні масиви?

  7. Що таке рядкова таблиця StringGrid?

  8. На якій сторінці знаходиться компонент StringGrid?

  9. Які властивості має компонент StringGrid?

  10. Що означає властивість Name компонента StringGrid?

  11. Поясніть, для чого існують властивості RowCount та ColCount компонента StringGrid.

  12. Як утворити процедуру FormCreate?

  13. Поясніть запис: tabl.Cells[2,l 1].

  14. Яким чином можна ввести елементи матриці в ЕОМ?

  15. Для чого слід складати таблицю значень властивостей компонентів форми?

  16. Які помилки найбільш поширені при використанні масивів?

  17. Як Delphi 6 реагує на помилку?

  18. Для чого використовується вкладка Compiler діалогового вікна Project Option?

  19. Як додати ім'я модуля програміста до списку модулів, що використовуються у Delphi?

  20. Як слід компілювати програму після додавання модуля до проекту?



Література


1. Архангельский А. Я. Разработка прикладных программ для Windows в Delphi 5 / А.Я. Архангельский. - М.: БИНОМ, 1999. - 256 с.

2. Бобровский С. И. Delphi 7: учеб. курс / С.И. Бобровский. - СПб.: Питер, 2004. - 736 с.

3. Фаронов В. Программирование баз данных в Delphi 6: Учебный курс / В. Фаронов. - СПб.: Питер, 2002. - 352 с:ил

4. Фаронов В. В. Delphi : программирование на языке высокого уровня : учебник для студ., обуч. по напр. подготовки дипломир. спец. "Информатика и вычис. техника" / В. В. Фаронов. - СПб.: Питер, 2005. - 640 с.

5. Фаронов В.В. Delphi 6. Учебный курс. –М. Нолидж, 2004. – 425 с.








Схожі:

Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconЛекція №2 Тема: Програмування на Object Delphi: програмування простих обчислювальних процесів План 1 Палітру компонентів Standart 1
Тема: Програмування на Object Delphi: програмування простих обчислювальних процесів
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconЛекція №1 Тема: Програмування на object pascal в Delphi: введення План Історія розвитку Delphi 1 1 Об\'єктно-орієнтоване програмування 1
С. Яка з мов краще відповісти достатньо складно. Проте з упевненістю можна вважати, що Pascal краще за інші мови підходить для навчання...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconТема7: Автосума. Формули. Зсилки
Мета: Ознайомити учнів з автосумою в електронних таблицях, використанням формул для певної комірки та масиву комірок (формула масиву),...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconМіністерство освіти І науки, молоді та спорту україни вінницька область мурованокуриловецька районна рада районний методичний кабінет
Потрібно скласти програму, яка зчитує ці дані І обчислює вказані величини. Заданий масив та результати вивести на екран та у файл...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconЛекція №3 Тема: Програмування в Object Delphi: оператори циклу План 1 Оператора for 1 2 Оператор while 2 3 Оператор repeat 4
Алгоритми рішення багатьох задач є циклічними, тобто для досягнення результату певна послідовність дій повинна бути виконана кілька...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconМетодична розробка задачі з програмування для теми «Текстові файли» Криміналістична задача
Можна сказати, що кількість кроків між домом і школою – величина випадкова. Провівши 20 спостережень, ви отримаєте 20 значень випадкової...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconЛабораторна робота Робота із масиви Мета роботи: вивчити засоби мови Сі для оголошення масивів даних, звернення до їх елементів за допомогою індексів, введення масивів з клавіатури та виведення на екран
Освоїти способи звернення до елементів масивів за допомогою вказівників. Навчитись виділяти та використовувати динамічну пам’ять...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconДерево фенвіка у статті розглядається структура даних, яка дозволяє знаходити суму сусідніх елементів масиву, а також модифікувати їх за логарифмічний час.
У статті розглядається структура даних, яка дозволяє знаходити суму сусідніх елементів масиву, а також модифікувати їх за логарифмічний...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconПрактична робота №10. Робота з масивами чисел
Форма повинна виглядати так, як показано на рисунку. У меню Project вибрати Add Module (додати модуль) І відкрити його для створення...
Лекція №4 Тема: Програмування на Object Delphi: масиви План 1 Одновимірні масиви 1 1 Оголошення масиву 1 2 Виведення масиву 2 3 Введення масиву 3 iconТема. Створення I реалiзацiя програм на введення та виведення даних
Мета. Поглибити знання та практичнi навички роботи з середовищем програмування. Навчи­тися створювати програми з організацією введення...
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©te.zavantag.com 2000-2017
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи