- •Раздел 4. Разработка по Тема 4.1. Проектирование интерфейса с пользователем
- •4.1.1. Типы пользовательских интерфейсов.
- •4.1.2. Пользовательская и программная модели интерфейса.
- •4.1.3. Разработка диалогов.
- •4.1.4. Основные компоненты графических пользовательских интерфейсов.
- •Тема 4.2. Реализация графических пользовательских интерфейсов.
- •4.2.1. Диалоги, управляемые пользователем.
- •4.2.2. Диалоги, управляемые системой.
- •4.2.3. Использование метафор.
- •4.2.4. Технология Drag and Drop.
- •4.2.5. Интеллектуальные элементы.
- •4.3.1. Базовые типы данных.
- •Константы
- •Область действия имен
- •4.3.2. Указатели и адресная арифметика.
- •4.3.3. Составные типы данных. Структуры
- •Битовые поля
- •Определение типов
- •Перечислимые типы
- •4.3.4. Выражения и операции.
- •4.3.5. Управляющие конструкции. Условные операторы
- •Операторы циклов
- •4.4.1. Статические одномерные массивы.
- •4.4.2. Статические многомерные массивы.
- •4.4.3. Динамические массивы.
- •4.4.4. Массивы указателей.
- •4.5.1. Стеки.
- •4.5.2. Очереди.
- •4.5.3. Списки.
- •4.5.4. Бинарные деревья.
- •4.6.1. Объявление классов и экземпляров классов.
- •4.6.2. Инкапсуляция данных и методов.
- •4.6.3. Конструкторы классов.
- •Конструктор по умолчанию
- •Конструктор копирования
- •4.6.4. Деструкторы классов.
- •4.7.1. Разделы в описании класса.
- •4.7.2. Friend-конструкции.
- •4.7.3. Статические члены классов.
- •4.7.4. Использование описателя const в классах.
- •4.8.1. Вложенность классов.
- •4.8.2. Наследование данных и методов.
- •4.8.3. Типы наследования.
- •4.9.1. Полиморфизм раннего связывания.
- •4.9.2. Полиморфизм позднего связывания и виртуальные функции.
- •4.9.3. Абстрактные методы и классы.
- •4.10.1. Функции консольного ввода-вывода.
- •4.10.2. Функции файлового ввода-вывода.
- •4.10.3. Использование библиотеки классов потокового ввода-вывода.
- •4.11.1. Перегрузка операций.
- •4.11.2. Шаблоны функций.
- •4.11.3. Шаблоны классов.
- •4.11.4. Обработка исключений.
- •Тема 4.12. Com-технология.
- •4.12.1. Основные понятия.
- •4.12.2. Типы интерфейсов.
- •Свойства интерфейсов
- •Типы интерфейсов
- •4.12.3. Типы com-объектов.
- •4.12.4. Фабрика классов.
- •Тема 4.13. Построение com-сервера.
- •4.13.1. Язык idl.
- •Содержимое файла idl
- •4.13.2. Определение пользовательского интерфейса.
- •4.13.3. Реализация пользовательского интерфейса.
- •4.13.4. Создание тестового клиента.
- •Тема 4.14. Обзор платформы ms .Net.
- •4.14.1. Общая идея архитектуры .Net.
- •4.14.2. Достоинства и недостатки .Net.
- •4.14.3. Схема трансляции программ в .Net.
- •4.14.4. Язык msil.
- •4.14.5. Объектно-ориентированная модель .Net.
4.3.5. Управляющие конструкции. Условные операторы
В языках С и C++ существуют две разновидности условных операторов или операторов выбора (selection statements): if-statement и switch-statement. Кроме того, есть условная операция (conditional ? :). которая по смыслу и способу функционирования очень похожа на оператор if.
Рассмотрим схему оператора if:
if (условие) { операторы } else { операторы }
Фигурные скобки в каждой ветви можно опустить, если оператор только один. Ветвь else необязательна. Условие (точнее, условное выражение) вычисляется, и в зависимости от его результата происходит разветвление. Если знамение выражения равно 0 или NULL в случае указателей, то результат условного выражения считается false, иначе — true. В языке C++ теперь появился стандартный тип bool. Переменные этого типа могут принимать значения из множества {false, true}.
В качестве единственного оператора ветви может (снова) быть условный оператор. В этом случае говорят о вложенности условных операторов. Следует проявлять осторожность при программировании сложных условий, так как легко допустить ошибку в осмыслении семантики вложенных операторов. Например, пусть задана кусочно-непрерывная функция у(х) в виде графика (рис. А.1).
Рис. АЛ. Кусочно-непрерывная функция
Чтобы задать эту функцию с помощью цепочки вложенных условных операторов, определим переменные double x, у; и, выделив участки оси х, где функция определяется однозначно, получим:
if (х>1)
if (x>2)
if (x>3)
if (x>4) у=0;
else у=-2*х+8; else y=2: else у=2*х-2; else y=0 ;
Отступами принято показывать, какой else соответствует данному if. Однако компилятор игнорирует отступы и устраняет двусмысленность, приписывая else последнему незакрытому if. Рассмотрим фрагмент программы:
if (x==2)
if (y==2) puts ("x и у равны 2"); else puts ("x не равен 2");
Здесь функция puts служит для вывода строки символов.
Второй вывод ложен, так как, несмотря на отступы, else относится к внутреннему if. Однако если условный оператор заключить в блок из фигурных скобок, то вывод станет верным, так как теперь внутренний if не имеет соответствующего else. Действительно:
if (х==2) {
if (у==2) puts ("x и у равны 2"): } else puts ("x не равен 2"):
Другой условный оператор switch позволяет передать управление на какую-то одну из множества ветвей типа case. Алгоритм функционирования оператора можно описать в виде схемы:
switch (выражение)
{
case константа1: операторы;
case константа2: операторы;
default: операторы;
}
Результатом выражения должно быть значение одного из целых типов. Каждый case-оператор должен быть снабжен константной меткой целого типа (или сводимого к нему). Управление после вычисления выражения передается той ветви, метка которой совпадает со значением выражения. Если такой константы не нашлось, управление передается в ветвь default. Наличие этой ветви не обязательно. Если ее нет и нет подходящей константы, то ни одна из ветвей не получит управления. Допустимым считается случай, когда два или более case-оператора обозначают одну и ту же ветвь. Порядок следования ветвей произвольный, поэтому ветвь с меткой default может быть как первой, так и любой другой. Последовательность выполнения операторов в случае попадания в любую ветвь обычная, поэтому после выполнения всех операторов данной ветви управление передается в следующую ветвь, так как метки при выполнении игнорируются. Чтобы в конце ветви передать управление за пределы оператора switch, необходимо использовать оператор break. Другими возможными средствами выхода из switch являются операторы перехода (jump statements):
goto метка; continue; return;
Оператор return; осуществляет выход из функции, ничего не возвращая в точку вызова. Оператор return value; возвращает значение переменной value. Оператор continue; передает управление в конец самого внутреннего открытого цикла. Оператор goto метка; осуществляет переход в точку программы, которая помечена меткой (идентификатором, ссылающимся на адрес следующего выполнимого оператора).
Рассмотрим выражение: (условие) ? exprl : ехрг2;. Оно вычисляется в таком порядке. Сначала вычисляется условие. Если результат не равен нулю (условие выполнено), то вычисляется exprl, а ехрг2 игнорируется. Если условие дает нулевой результат (false), то вычисляется ехрг2, a exprl игнорируется. Так как операция ? : требует трех аргументов, то ее называют тернарной. Она также носит название Conditional ? :. Ее удобно рассматривать как разновидность условного оператора. Однако специфика тернарной операции заключается в том, что она возвращает значение, то есть она может быть rvalue. Например:
i = х<0 ? -1 : 1; //Равносильно if (x<0) i=-1; else i=1;
Выражения exprl и ехрг2 могут, в свою очередь, быть операторами вида Conditional ? :. Поэтому можно создавать и более сложные конструкции, например:
i = х<0 ? -1 : х>0 ? 1 : 0;
Переменной i будет присвоено значение –1, 1, или 0 в зависимости от отрицательности, положительности или равенства нулю значения х.