Skip to Content

Инструкция case

Инструкция case

В предыдущем примере, в программе контроля веса, множественный выбор был реализован при помощи вложенных одна в другую инструкций if. Такой подход не всегда удобен, особенно в том случае, если количество вариантов хода программы велико.

В языке Delphi есть инструкция case, которая позволяет эффективно реализовать множественный выбор. В общем виде она записывается следующим образом:

case Селектор of
список1:
begin
{ инструкции 1 }
end;
список2:
begin
{ инструкции 2 }
end;
списокМ:
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 инструкция программы.

На рис. 2.7 приведен алгоритм, реализуемый инструкцией case.


Рис. 2.7. Алгоритм, реализуемый инструкцией case Ниже приведены примеры инструкции case.

  1. case n_day of
  2. 1,2,3,4,5: day:='Рабочий день. ' ;
  3. 6: day:='Cyббoтa!';
  4. 7: day:='Воскресенье!';
  5. end;
  6.  
  7. case n_day of
  8. 1..5: day:='Рабочий день.';
  9. 6: day:='Суббота!';
  10. 7: day:='Воскресенье!';
  11. end;
  12.  
  13. case n_day of
  14. 6: day:='Суббота!';
  15. 7: day:='Воскресенье!';
  16. else day:='Рабочий день.';
  17. end;

В качестве примера использования инструкции case рассмотрим программу, которая пересчитывает вес из фунтов в килограммы. Программа учитывает, что в разных странах фунт "весит" по-разному. Например, в России фунт равен 409,5 граммов, в Англии — 453,592 грамма, а в Германии, Дании и Исландии фунт весит 500 граммов.

В диалоговом окне программы, изображенном на рис. 2.8, для выбора страны используется список Страна.



Рис. 2.8. Диалоговое окно программы Пример использования case

Для выбора названия страны используется список — компонент ListBox. Значок компонента ListBox находится на вкладке Standard (рис. 2.9). Добавляется список к форме приложения точно так же, как и другие компоненты, например, командная кнопка или поле редактирования. В табл. 2.5 приведены свойства компонента ListBox.


Рис. 2.9. Компонент ListBox

Таблица2.5. Свойства компонента ListBox

Свойство Определяет
Name Имя компонента. В программе используется для доступа к свойствам компонента
Items Элементы списка
Itemindex Номер выбранного элемента списка. Номер первого элемента списка равен нулю
Left Расстояние от левой границы списка до левой границы формы
Top Расстояние от верхней границы списка до верхней границы формы
Height Высоту поля списка
Width Ширину поля списка
Font Шрифт, используемый для отображения элементов списка
Parent-Font Признак наследования свойств шрифта родительской формы

Наибольший интерес представляют свойства Items и Itemindex. Свойство items содержит элементы списка.

Свойство itemindex задает номер выбранного элемента списка. Если ни один из элементов не выбран, то значение свойства равно минус единице.

Список может быть сформирован во время создания формы или во время работы программы.

Для формирования списка во время создания формы надо в окне Object Inspector выбрать свойство items и щелкнуть на кнопке запуска редактора списка строк (рис. 2.10).


Рис. 2.10. Кнопка запуска редактора списка

В открывшемся диалоговом окне String List Editor (рис. 2.11) нужно ввести список, набирая каждый элемент списка в отдельной строке. После ввода очередного элемента списка для перехода к новой строке необходимо нажать клавишу . После ввода последнего элемента клавишу нажимать не надо. Завершив ввод списка, следует щелкнуть на кнопке ОК.


Рис. 2.11. Редактор списка

В табл. 2.6 перечислены компоненты формы приложения, а в табл. 2.7 приведены значения свойств компонентов.

Таблица 2.6. Компоненты формы

Компонент Назначение
ListBoxl Для выбора страны, для которой надо выполнить пересчет
Editl Для ввода веса в фунтах
Label1, Label2, Label3 Для вывода пояснительного текста о назначении полей ввода
Label4 Для вывода результата пересчета
Button1 Для активизации процедуры пересчета веса из фунтов в килограммы

Таблица 2.7. Значения свойств компонентов

Свойство Значение
Form1 .Caption Пример использования case
Editl. Text
Label1 . Caption Выберите страну, введите количество фунтов и щелкните на кнопке Вычислить
Label2 .Caption Страна
Label3 . Caption Фунтов
Button1 . Caption Вычислить

Процедура пересчета, которая выполняется в результате щелчка на командной кнопке Вычислить, умножает вес в фунтах на коэффициент, равный количеству килограммов в одном фунте. Значение коэффициента определяется по номеру выбранного из списка элемента.

В листинге 2.3 приведен текст программы пересчета веса из фунтов в килограммы.

Листинг 2.3. Пересчет веса из фунтов в килограммы

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Classes,
  7. Graphics, Controls, Forms, Dialogs, StdCtrls;
  8.  
  9. type
  10.  
  11. TForm1 = class(TForm)
  12. Label2: TLabel;
  13. Editl: TEdit; // поле ввода веса в фунтах
  14. Button1: TButton; // кнопка Вычислить
  15. Label1: TLabel;
  16. LabelS: TLabel;
  17. ListBox1: TListBox; // список стран
  18. Label4: TLabel; // поле вывода рез-та — веса в килограммах
  19.  
  20. procedure FqrmCreate(Sender: TObject);
  21. procedure ButtonlClick(Sender: TObject);
  22.  
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form1: TForml;
  31.  
  32. implementation
  33.  
  34. {$R *.DFM}
  35.  
  36. procedure TForml.FormCreate(Sender: TObject);
  37. begin
  38. {
  39. ListBox1.items.add('Россия');
  40. ListBox1.items.add('Австрия');
  41. ListBox1.iterns.add('Англия');
  42. ListBox1.items.add('Германия');
  43. ListBox1.iterns.add ('Дания');
  44. ListBoxl.iterns.add('Исландия');
  45. ListBox1.iterns.add ('Италия');
  46. ListBox1.items.add ('Нидерланды'); }
  47.  
  48. ListBox1.itemindex:=0;
  49. end;
  50.  
  51. procedure TForm1.ButtonlClick(Sender: TObject);
  52. var
  53.  
  54. funt:real; // вес в фунтах
  55. kg:real; // вес в килограммах
  56. k:real; // коэффициент пересчета
  57.  
  58. begin
  59.  
  60. case ListBoxl.Itemindex of
  61. 0: k:=0.4095; // Россия
  62. 1: k:=0.453592; // Англия
  63. 2:k:=0.56001; // Австрия
  64. 3..5,7:k:=0.5; // Германия, Дания, Исландия, Нидерланды
  65. 6: k:=0.31762; // Италия
  66.  
  67. end;
  68.  
  69. funt:=StrToFloat(Editl.Text);
  70. kg:=k*funt;
  71. label4.caption:=Editl.Text
  72. + ' ф. — это ' + FloatToStrF(kg,ffFixed, 6,3) + 'кг.';
  73.  
  74. end;
  75. end.

Следует обратить внимание на процедуру обработки события FormCreate, которое происходит в момент создания формы (форма создается автоматически при запуске программы). Эту процедуру можно использовать для инициализации переменных программы, в том числе и для добавления элементов в список. В приведенном тексте программы инструкции создания списка закомментированы, т. к. список был создан при помощи редактора строк во время создания формы.

Рассмотрим еще один пример использования инструкции case. При выводе числовой информации с поясняющим текстом возникает проблема согласования выводимого значения и окончания поясняющего текста.

Например, в зависимости от числового значения поясняющий текст к денежной величине может быть: "рубль", "рублей" или "рубля" (123 рубля, 120 рублей, 121 рубль). Очевидно, что окончание поясняющего слова определяется последней цифрой числа, что отражено в табл. 2.8.

Таблица 2.8. Зависимость окончания текста от последней цифры числа

Цифра Поясняющий текст
0, 5, 6, 7, 8, 9 Рублей
1 Рубль
2,3,4 Рубля

Приведенное в таблице правило имеет исключение для чисел, оканчивающихся на 11, 12, 13, 14. Для них поясняющий текст должен быть "рублей".

Диалоговое окно программы приведено на рис. 2.12, а текст — в листинге 2.4. Поясняющий текст формирует процедура обработки события onKeyPress.


Рис. 2.12. Диалоговое окно программы

Листинг 2.4. Формирование поясняющего текста

  1. unit. rub_l; interface
  2.  
  3. uses
  4. Windows, Messages, SysUtils,
  5. Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls;
  7.  
  8. type
  9.  
  10. TForm1 = class(TForm)
  11. Label1: TLabel;
  12. Editl: TEdit;
  13. Label2: TLabel;
  14.  
  15. procedure EditlKeyPress(Sender: TObject; var Key: Char);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21.  
  22. var
  23.  
  24. Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. // нажатие клавиши
  31.  
  32. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char)
  33. var
  34. n : integer; // число
  35. r : integer; // остаток от деления n на 10
  36. text: string[10]; // формируемый поясняющий текст
  37.  
  38. begin
  39.  
  40. if Key = chr(VK_RETURN) then
  41. begin
  42. n := StrToInt(Editl.Text);
  43.  
  44. if n > 100 then
  45. n:=n mod 100;
  46.  
  47. if (n >= 11) and (n <= 14) then
  48. text:=' рублей'
  49. else
  50. begin
  51. r:= n mod 10;
  52.  
  53. case r of
  54. 1: text:=' рубль';
  55. 2 .. 4: text:=' рубля';
  56. else
  57. text:=' рублей';
  58.  
  59. end;
  60. end;
  61.  
  62. Label2.Caption := IntToStr(n)+ text;
  63.  
  64. end;
  65. end;
  66. end.

Рассмотрим фрагмент программы (листинг 2.5), которая вычисляет дату следующего дня, используя сегодняшнюю дату, представленную тремя переменными: day (день), month (месяц) и year (год).

Сначала с помощью инструкции сазе проверяется, является ли текущий день последним днем месяца. Если текущий месяц — февраль и если текущее число — 28, то дополнительно выполняется проверка, является ли год високосным. Для этого вычисляется остаток от деления года на 4. Если остаток равен нулю, то год високосный, и число 28 не является последним днем месяца.

Если выясняется, что текущий день — последний день месяца, то следующее число — первое. Затем проверяется, не является ли текущий месяц декабрем. Если нет, то увеличивается номер месяца, а если да, то увеличивается номер года, а номеру месяца присваивается значение 1.

Листинг 2.5. Вычисление даты следующего дня (фрагмент)

  1. // вычисление даты следующего дня
  2.  
  3. var
  4. day: integer; // день
  5. month: integer; // месяц
  6. year: integer; // гОД
  7. last:boolean; // если день — последний день месяца,
  8. // то last = True
  9.  
  10. r:integer; // если год не високосный, то остаток
  11.  
  12. // от деления year на 4 не равен нулю
  13.  
  14. begin
  15.  
  16. { переменные day, month и year содержат сегодняшнюю дату }
  17.  
  18. last := False; // пусть день — не последний день месяца
  19. case month of
  20. 4,6,9,11:
  21. if day = 30 then
  22. last:= True;
  23. 2:
  24. if day = 28 then
  25. begin
  26. r:= year mod 4;
  27.  
  28. if r <> 0 then
  29. last:= True;
  30.  
  31. end;
  32.  
  33. else:
  34. if day=31 then
  35. last:= True;
  36. end;
  37. if last then
  38. begin // последний день месяца day:= 1;
  39.  
  40. if month =12 then
  41. begin // последний месяц
  42. month:= 1;
  43. year:= year + 1;
  44.  
  45. end
  46.  
  47. else
  48. month:= month + 1;
  49.  
  50. end
  51.  
  52. else day:= day + 1;
  53.  
  54. // переменные day, month и year
  55. // содержат завтрашнюю дату
  56.  
  57. end;



Delphi Для профессионалов &1   |    Delphi Для профессионалов &2   |    Delphi Для профессионалов &3   |    Иллюстрированный самоучитель &1   |    Иллюстрированный самоучитель &2