- •Змістовий модуль 2 Практичне заняття № 1
- •Література
- •Короткі теоретичні відомості
- •1: Writeln(‘один’);
- •4: Writeln(‘чотири’);
- •Завдання для виконання
- •Домашнє завдання
- •Контрольні питання
- •Практичне заняття № 2
- •Література
- •Короткі теоретичні відомості
- •Завдання для виконання
- •Контрольні питання
- •Практичне заняття № 3
- •Література
- •Короткі теоретичні відомості Оператор while
- •3 Оператор repeat
- •Завдання для виконання
- •Контрольні питання
- •Практичне заняття № 4
- •Література
- •Короткі теоретичні відомості
- •Завдання для виконання
- •Змістовий модуль 3 Практичне заняття № 5
- •Література
- •Завдання для виконання
- •Опис плану розробки програми
- •Практичне заняття № 6
- •Література
- •Завдання для виконання
- •Практичне заняття № 7
- •Література
- •Завдання для виконання
- •Практичне заняття № 8
- •Література
- •Завдання для виконання
- •Створити програму, яка виводить поточний час та дату.
- •Практичне заняття № 9
- •Література
- •Завдання для виконання
- •Опис плану розробки програми
- •Практичне заняття № 10
- •Література
- •Завдання для виконання
- •Практичне заняття № 11
- •Література
- •Завдання для виконання
- •Практичне заняття № 12
- •Література
- •Завдання для виконання
- •Графіка
- •Переміщення малюнків
- •Практичне заняття № 13
- •Література
- •Завдання для виконання
Завдання для виконання
На одній із знаменитих гравюр Альбрехта Дюрера зображений магічний квадрат. Однією з його властивостей є те, що суми по всіх стовпцях, рядках і діагоналях рівні. Мета роботи - створити програму, що розраховуватиме суму по стовпцях і рядках чисел, що вводяться.
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 форми виводиться нагадування.
