Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktichni_roboti.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
3.56 Mб
Скачать

Завдання для виконання

На одній із знаменитих гравюр Альбрехта Дюрера зображений магічний квадрат. Однією з його властивостей є те, що суми по всіх стовпцях, рядках і діагоналях рівні. Мета роботи - створити програму, що розраховуватиме суму по стовпцях і рядках чисел, що вводяться.

1. Додати на форму сітку - компонент StringGrid. Цей компонент служить для введення і виведення табличних даних. 2. Необхідно ввести дані і описати подію реагування на їх введення. У властивості Options встановіть пункт Editing, інакше сітка буде доступною тільки для читання. Тепер при запуску програми можна вводити текст. 3. Клацнувши мишкою в Інспекторі Об'єктів, описати обробник події OnSelectCell, яка виникає, коли користувач вибирає яку-небудь комірку для редагування. 4. Тепер при запуску програми і виборі комірки в заголовку форми відображається інформація про стовбець та рядок вводу. 5. Таким чином, в розділі uses виникло посилання на модуль Grids, в якому описані компоненти сіток. В описі класу форми додалася змінна - посилання на компонент сітки, а також опис методу - обробника події. сам оброблювач описаний вже в розділі implementation.

6. Обробити подію, що виникає, коли користувач намагається виділити яку-небудь комірку.

procedure Tform1.StringGrid1SelectCell(Sender: Tobject; Acol, Arow: Integer;

var CanSelect: Boolean);

begin

Caption := ‘Выделена клетка (‘ + IntToStr(Acol) + ‘:’ + IntToStr(Arow) + ‘) ‘;

end;

В якості параметрів оброблювач одержує (крім Sender) номер стовпця, номер рядка і змінну CanSelect, яку можна змінити всередині обробника, так як вона передається як var.

Alpha

Можна, наприклад, заборонити виділення комірок третього стовпця. Для цього вставте в цей обробник ще рядок: CanSelect: = (Acol <> 3); У цьому випадку CanSelect буде дорівнює false, якщо Acol = 3. 7. Налаштувати сітку в залежності від значення констант, які треба оголосити в interface. Тепер при запуску програми сітка має розмір, заданий у константі, і виглядає значно акуратніше. Якщо змінити значення константи, то при запуску і розмір сітки буде відповідним.

8. Установити розмір сітки згідно значенню констант Num і сSize, оголошених в interface:

cSize = 30;

……

procedure Tform1.FormCreate(Sender: Tobject);

begin

MyGrid.DefaultColWidth := cSize;

MyGrid.DefaultRowHeight := cSize;

MyGrid.ColCount := Num;

MyGrid.RowCount := Num;

MyGrid.Width := Num * (cSize + 1) + 3;

MyGrid.Height := Num * (cSize + 1) + 3;

MyGrid.Font.Size := cSize div 2;

end;

У наведеному ділянці коду змінюються ширина і висота сітки, встановлені за замовчуванням, а також кількість рядків і стовпців сітки. Додавання одиниці до ширини кожної комірки пов'язано з наявністю ліній між комірками, а додавання трійки до всієї суми - наявністю бордюру навколо сітки. В останньому рядку встановлюється відповідний величині клітинки розмір шрифту.

9. Для розрахунку суми по стовпцях і рядках чисел, що вводяться написати власну процедуру і дві функції.

Функції будуть розраховувати суму в рядку і стовпці, отримуючи їх номер в якості параметра. Процедура буде в циклі викликати ці функції і відповідним чином заповнювати клітинки.

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

Function ColSum(n: integer): integer;

var

i: integer;

begin

Result := 0;

for I := 1 to Num – 1 do Result := Result + StrToInt (Form1.MyGrid.Cells[n, i]);

end;

function RowSum(n: integer): integer;

var

i: integer;

begin

Result := 0;

for I := 1 to Num – 1 do Result := Result + StrToInt(Form1.MyGrid.Cells[I, n]);

end;

procedure Calculate;

var i: integer;

begin

for I := 1 to Num – 1 do

begin

Form1.MyGrid.Cells[I, 0] := IntToStr(ColSum(i));

Form1.MyGrid.Cells[0, i] := IntToStr(RowSum(i));

end;

end;

У даній програмі використовується властивість Cells, компонента сітки. Ця властивість має тип двовимірного масиву рядків. Рахунок у цьому масиві починається з нуля.

Фіксовані (сірі) клітини, з точки зору індексування масиву, нічим не відрізняються від інших. У нашому випадку фіксовані перший рядок і перший стовпець (в масиві вони мають відповідні нульові координати). Тому при розрахунку суми проходять від 1 (а не від 0) до Num - 1 (при індексуванні з нуля останній стовпець / рядок мають, зрозуміло, номер Num - 1). Однак, якщо відбудеться введення якої-небудь літери, одразу виникне виняткова ситуація. Вона, очевидно, виникає через неможливість перекладу букви в число в функції StrToInt. Якщо небажано, щоб при виникненні виняткової ситуації програма в Delphi переходила в режим відладки, можна відключити прапорець Menu => Tools => Debugger Options => Language Exceptions => Stop on Delphi Exceptions. Тепер програма буде виконуватися так, як якщо б вона виконувалася під Windows. Тепер кожного разу, коли вводиться нечисловий символ, програма не зупиняється, а тільки з'являється стандартне вікно Windows з повідомленням про помилку.

За допомогою обробки виключень можна уникнути появи цього вікна. Для цього треба додати в функцію конструкцію try .. except. Таким чином «небезпечна» команда (або цілий блок) поміщається всередину конструкції try .. except .. end або try .. finally .. end:

function StrToVal(s: string): integer;

begin

if S = ‘’ then Result := 0 else

try

Result := StrToInt(s);

except

Result := 0;

Form1.Caption := ‘Вводить надо числа!’;

end;

end;

Якщо виникає виняткова ситуація, тобто введено нечислові значення, вважається, що введено нуль, а також виводиться повідомлення про це користувачеві. Ще потрібно додати виведення інформації, що все в порядку. А також видалити код всередині обробника Click форми. У результаті, якщо введено неправильне значення, то вікно помилки не з'являється, а в Caption форми виводиться нагадування.

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