Обладнання та програмне забезпечення
Лабораторна робота №4
Написання програм множинного вибору (використання інструкції Case, компоненти ListBox).
Склав: викладач
Селемонавічус А.А.
Львів 2009 р.
Мета роботи
Навчитись реалізовувати програми з використанням умовних інструкцій (Case) на мові Object Pascal.
2. Теоретичні відомості.
Інструкція case
У попередній практичній, у програмі контролю ваги, множинний вибір був реалізований за допомогою вкладених одна в іншу інструкцій if. Такий підхід не завжди зручний, особливо в тому випадку, якщо кількість варіантів ходу програми достатньо великий.
У мові Delphi є інструкція case, що дозволяє ефективно реалізувати множинний вибір. У загальному виді вона записується в такий спосіб:
case Селектор of список1:
begin
{ інструкції 1 } end; список2:
begin
{ інструкції 2 } end; список3:
begin
{ інструкції N }
end;
else
begin
{ інструкції )
end;
end;
де:
Селектор - вираз, значення якого визначає подальший хід виконання програми (тобто послідовність інструкцій, що буде виконана);
Список N - список констант. Якщо константи являють собою діапазон чисел, то замість списку можна вказати першу і останню константу діапазону, розділивши їхніми двома крапками. Наприклад, список 1, 2, 3, 4, 5, 6 може бути замінений діапазоном 1..6.
Виконується інструкція case у такий спосіб:
1. Спочатку обчислюється значення виразу-селектора.
2. Значення виразу-селектора послідовно рівняється з константами зі списків констант.
3. Якщо значення виразу збігається з константою зі списку, то виконується відповідна цьому списку група інструкцій. На цьому виконання інструкції саsе завершується.
4. Якщо значення виразу-селектора не збігається з жодною константою із всіх списків, то виконується послідовність інструкцій, що випливає за else.
Синтаксис інструкції case дозволяє не писати else і відповідну послідовність інструкцій. У цьому випадку, якщо значення вираження не збігається з жодною константою із всіх списків, то виконується наступна за case інструкція програми.
На рисунку 1.7 наведений алгоритм, реалізований інструкцією case.
Рис. 1.7. Алгоритм, реалізований інструкцією case
Нижче наведені приклади інструкції case.
case n_day of
1,2,3,4,5: day:=' Робочий день. ' ;
6: day:=' Cyбoтa !';
7: day:='Неділя!';
end;
case n_day of
1..5: day:='Робочий день.';
6: day:='Субота!';
7: day:='Неділя!';
end;
case n_day of
6: day:='Субота!';
7: day:='Неділя!';
else day:='Робочий день.';
end;
3. Підготовка до виконання роботи.
3.1. Підготувати бланк звіту з роботи;
3.2. Опрацювати теоретичний матеріал за темою роботи;
3.3. Використовуючи теоретичний матеріал дати відповіді на контрольні запитання.
4. Контрольні питання
1) Намалюйте блок – схему алгоритму, реалізованого інструкцією Case
2) Наведіть загальний опис інструкції CASE
3) Що таке селектор, які значення він може приймати?
4) Що таке керуючі конструкції мови Delphi?
5) Що таке безумовні конструкції мови Delphi?
6) Що таке умовні конструкції мови Delphi?
Обладнання та програмне забезпечення
5.1. Персональний комп’ютер з операційною системою Windows;
5.2. Программа Delphi
Порядок виконання роботи
6.1. Запустити програму Delphi;
6.2. Реалізувати наведені приклади задач (задача 1 – 2) з використанням програми Delphi:
6.3. Розробити власну програму, що використовує умову вибору Case
6.4. Реалізувати наведені приклади опитувань ( індивідуальні завдання задача 1 – 2) з використанням програми Delphi:
Задача 1.Як приклад використання інструкції case розглянемо програму, що перераховує вагу з фунтів у кілограми. Програма враховує, що в різних країнах фунт "важить" по-різному. Наприклад, у Росії фунт дорівнює 409,5 грамів, в Англії - 453,592 грама, а в Німеччині, Данії і Ісландії фунт важить 500 грамів.
У діалоговому вікні програми, зображеному на рисунку 1.8, для вибору країни використається список Країна.
Рис. 1.8. Діалогове вікно програми Приклад використання case
Для вибору назви країни використається список — компонентів ListBox. Значок компонента ListBox перебуває на вкладці Standard (рисунок 1.9). Додається список до форми додатка точно так само, як і інші компоненти, наприклад, командна кнопка або поле редагування. У таблиці 1.5 наведені властивості компонента ListBox.
Рис. 1.9. Компонент ListBox
Таблиця 1.5. Властивості компонента ListBox
Властивість | Визначає |
Name | Ім'я компонента. У програмі використається для доступу до властивостей компонента |
Items | Елементи списку |
Itemindex | Номер обраного елемента списку. Номер першого елемента списку дорівнює нулю |
Left | Відстань від лівої границі списку до лівої границі форми |
Top | Відстань від верхньої границі списку до верхньої границі форми |
Height | Висоту поля списку |
Width | Ширину поля списку |
Font | Шрифт, використовуваний для відображення елементів списку |
Parent-Font | Ознака спадкування властивостей шрифту батьківської форми |
Найбільший інтерес представляють властивості Items і Itemindex. Властивість items містить елементи списку.
Властивість itemindex задає номер обраного елемента списку. Якщо жоден з елементів не обраний, то значення властивості дорівнює мінус одиниці.
Список може бути сформований під час створення форми або під час роботи програми.
Для формування списку під час створення форми треба у вікні Object Inspector вибрати властивість items і клацнути на кнопці запуску редактора списку рядків (рисунок 1.10).
Рис. 1.10. Кнопка запуску редактори списку
У діалоговому вікні, що відкрилося, String List Editor (рис. 1.11) потрібно ввести список, набираючи кожен елемент списку в окремому рядку. Після введення чергового елемента списку для переходу до нового рядка необхідно нажати клавішу <Enter>. Після введення останнього елемента клавішу <Enter> натискати не треба. Завершивши введення списку, варто клацнути на кнопці ОК.
Рис. 1.11. Редактор списку
У таблиці 1.6 перераховані компоненти форми додатка, а в таблиці 1.7 наведені значення властивостей компонентів.
Таблиця 1.6. Компоненти форми
Компонент | Призначення |
ListBoxl | Для вибору країни, для якої треба виконати перерахування |
Editl | Для введення ваги у фунтах |
Label1, Label2, Label3 | Для виводу пояснювального тексту про призначення полів введення |
Label4 | Для виводу результату перерахування |
Button1 | Для активізації процедури перерахування ваги з фунтів у кілограми |
Таблиця 1.7. Значення властивостей компонентів
Властивість | Значення |
Form1 .Caption | Приклад використання case |
Editl. Text | |
Label1 . Caption | Виберіть країну, уведіть кількість фунтів і клацніть на кнопці Обчислити |
Label2 .Caption | Країна |
Label3. Caption | Фунтів |
Button1. Caption | Обчислити |
Процедура перерахування, що виконується в результаті кліка на командній кнопці Обчислити, множить вагу у фунтах на коефіцієнт, дорівнює кількості кілограмів в одному фунті. Значення коефіцієнта визначається за номером обраного зі списку елемента.
У лістингу 1.3 наведений текст програми перерахування ваги з фунтів у кілограми.
Лістинг 1.3. Перерахування ваги з фунтів у кілограми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label2: TLabel;
Editl: TEdit; // поле введення ваги у фунтах
Button1: TButton; // кнопка Обчислити
Label1: TLabel;
Label: TLabel;
ListBox1: TListBox; // список країн
Label4: TLabel; // поле виводу результату - ваги в кілограмах
procedure FqrmCreate(Sender: TObject);
procedure ButtonlClick(Sender: TObject); private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForml;
implementation
{$R *.DFM}
procedure TForml.FormCreate(Sender: TObject);
begin
{
ListBox1.items.add('Росія');
ListBox1.items.add('Австрія');
ListBox1.iterns.add('Англія');
ListBox1.items.add('Німеччина');
ListBox1.iterns.add ('Данія');
ListBoxl.iterns.add('Ісландія');
ListBox1.iterns.add ('Італія');
ListBox1.items.add ('Нідерланди'); }
ListBox1.itemindex:=0; end;
procedure TForm1.ButtonlClick(Sender: TObject);
var
funt:real; // вага у фунтах
kg:real; // вага в кілограмах
k:real; // коефіцієнт перерахування
begin
case ListBoxl.Itemindex of
0: k:=0.4095; // Росія
1: k:=0.453592; // Англія
2:k:=0.56001; // Австрія
3..5,7:k:=0.5; // Німеччина, Данія, Ісландія, Нідерланди
6: k:=0.31762; // Італія
end;
funt:=StrToFloat(Editl.Text);
kg:=k*funt;
label4.caption:=Editl.Text
+ ' ф. - це '
+ FloatToStr(kg,ffFixed, 6,3) + 'кг.';
end;
end.
Варто звернути увагу на процедуру обробки події FormCreate, що відбувається в момент створення форми (форма створюється автоматично при запуску програми). Цю процедуру можна використати для ініціалізації змінних програми, у тому числі і для додавання елементів у список. У наведеному тексті програми інструкції створення списку закоментовані, тому що список був створений за допомогою редактора рядків під час створення форми.
Задача 2. Розглянемо ще один приклад використання інструкції case. При виведенні числової інформації з текстом, що пояснює, виникає проблема узгодження виведеного значення і закінчення пояснюючого тексту.
Наприклад, залежно від числового значення текст, що пояснює, до грошової величини може бути: "рубль", "рублів" або "рубля" (123 рубля, 120 рублів, 121 рубль). Очевидно, що закінчення слова, що пояснює, визначається останньою цифрою числа, що показано в таблиці 1.8.
Таблиця 1.8. Залежність закінчення тексту від останньої цифри числа
Цифра | текст, пояснення |
0, 5, 6, 7, 8, 9 | Рублів |
Рубль | |
2,3,4 | Рубля |
Наведене в таблиці правило має виключення для чисел, що кінчаються на 11, 12, 13, 14. Для них текст, що пояснює, повинен бути "рублів".
Діалогове вікно програми наведене на рисунку 1.12, а текст - у лістингу 1.4. текст, пояснення, що формує процедура обробки події onKeyPress.
Рис. 1.12. Діалогове вікно програми
Лістинг 1.4. Формування тексту, пояснення
unit. rub_l; interface
uses
Windows, Messages, SysUtils,
Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm) Label1: TLabel;
Editl: TEdit; Label2: TLabel;
procedure EditlKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// натискання клавіші
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char) var
n : integer; // число
r : integer; // залишок від розподілу n на 10
text: string[10]; // формований текст, що пояснює
begin
if Key = chr(VK_RETURN) then
begin
n := StrToInt(Editl.Text); if n > 100
then n:=n mod 100;
if (n >= 11) and (n <= 14) then
text:=' рублів' else begin
r:= n mod 10; case r of
1: text:=' рубль'; 2 .. 4: text:=' рублі';
else text:=' рублів';
end;
end;
Label2.Caption := IntToStr(n)+ text; end;
end;
end.
7. Оформлення звіту
7.1. Мета роботи.
7.2. Завдання.
7.3. Виконання індивідуального завдання.
7.4. Висновки по роботі.
Література:
1. Митчел К. Керман “Программирование и отладка в Delphi Учебный курс”. Вильямс.2002р.
2. Турбо Паскаль 7.0.Киев: Издательская група BHV.
3. Г.В.Поддубный “Введение в програмирование на Delphi. Учебное пособие”.Одеса, 1999р.
Індивідуальні завдання:
Задача 1.
Скласти програму опитування з наступними пунктами опитування:
Задача 2:
Скласти програму опитування з наступними пунктами опитування: