- •Максимов м.Н.
- •3. Скалярные типы и выражения 51
- •5. Адреса, указатели, массивы, память 95
- •6. Функции, указатели, ссылки 132
- •7 Структуры, объединения и классы 170
- •Введение
- •Модуль 1
- •1.2. Этапы подготовки исполняемой программы
- •Представление чисел от 0 до 16 в разных системах счисления
- •1.3. Системы счисления
- •2.1. Общие сведения о программах, лексемах и алфавите
- •2.2. Идентификаторы и служебные слова
- •2.3. Типы данных
- •2.4. Константы
- •Типы, выбираемые компилятором по умолчанию для целых констант
- •Данные вещественного типа
- •2.5. Операции
- •2.6. Разделители
- •3. Скалярные типы и выражения
- •3.1. Определение и описание переменных
- •3.2. Явное и неявное преобразование типа
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Список литературы
- •Модуль 2
- •4.1. Последовательно выполняемые операторы
- •4.2. Операторы выбора
- •If( выражение) оператор_1 else оператор_2
- •If( выражение) оператор_1
- •4.3. Операторы цикла
- •4.4. Операторы передачи управления
- •If (условие) break;
- •4.5. Примеры численного моделирования цепей первого порядка
- •5. Адреса, указатели, массивы, память
- •5.1. Указатели и адреса объектов
- •5.2. Адресная арифметика, типы указателей и операции над ними
- •5.3. Свойства указателя типа void*
- •5.4. Свойства объекта cout
- •5.5. Массивы и указатели
- •5.6. Многомерные массивы, массивы указателей, динамические массивы
- •Проектные задания к модулю
- •Тесты рубежного контроля
- •6.2. Функции с переменным количеством параметров
- •6.3. Рекурсивные функции
- •6.4. Подставляемые (инлайн-) функции
- •6.5. Функции и массивы
- •6.6. Указатели на функции
- •Void f3(float) (...) // Определение функции
- •Int* f4(char *){...} // Определение функции
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Модуль 4
- •7 Структуры, объединения и классы
- •7.1 Структура как тип и совокупность данных
- •7.3 Объединения разнотипных данных
- •7.4 Деревья
- •7.5 Битовые поля структур и объединений
- •7.6 Компонентные функции структурированных объектов
- •7.7 Расширение действия (перегрузка) стандартных операций
- •7.8 Доступ к компонентам структурированного объекта
- •7.9 Классы и шаблоны
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Список литературы
- •Приложение 1
- •Приложение 2 Стандартная библиотека функций языка Си
4.2. Операторы выбора
К операторам выбора относят: условный оператор (if … else) и переключатель (switch). Каждый из них служит для разветвления пути выполнения программы.
Синтаксис условного оператора:
If( выражение) оператор_1 else оператор_2
Выражение должно быть скалярным и может иметь арифметический тип или тип указателя. Если оно не равно нулю (или не есть пустой указатель), то условие считается истинным и выполняется оператор_1. В противном случае, выполняется оператор_2. Оператор_1 и оператор_2 могут быть представлены оператором, составным оператором или блоком. На рис. 4.1 изображено общепринятое обозначение условного оператора на блоксхеме.
Рис. 4.1. Обозначение условного оператора на блок схеме
Допустима сокращённая форма условного оператора, в которой отсутствует else и оператор_2.
If( выражение) оператор_1
В этом случае при ложности (равенстве нулю) проверяемого условия никакие действия не выполняются и управление передаётся оператору, сразу следующему за оператором условия. Блок-схема условного оператора, в котором ртсутствует else будет выглядеть так, как показано на рис. 4.2.
Рис. 4.2. Обозначение условного оператора на блок-схеме
В свою очередь, операторы_1 и оператор_2 могут быть условными, что позволяет организовать цепочку проверок условий любой глубины вложенности. В этих цепочках каждый из условных операторов может быть как полным условным, так и иметь сокращённую форму записи.
При этом могут возникать ошибки неоднозначного сопоставления if и else. Синтаксис языка предполагает, что при вложенных условных операторов каждое else соответствует ближайшему к нему предшествующему if. Приведем два примера:
//пример 1
if(x==1) // 1
if(y==1) cout<<” х равно 1 и y равно 1”; // 2
else cout<<” x не равно 1”; // 3
//пример 2
if(x==1) // 4
{if(y==1) cout<<” х равно 1 и y равно 1”;} // 5
else cout<<” x не равно 1”; // 6
В первом примере else относится к if , записанному во второй строке. Во втором примере else относится к if , записанному в четвёртой строке. С точки зрения логики программы второй пример правилен, а первый нет, так как при x, равном единице, в первом примере может быть напечатана строка “x не равно 1” . Хотя с точки зрения компилятора (синтаксиса языка) все строки в обеих примерах записаны верно. Таким образом, с помощью фигурных скобок была ограничена область действия внутреннего условного оператора. Блок-схемы примеров приведены ниже на рис. 4.3.
Рис. 4.3. Блок-схема первого примера
Рис. 4.4 Блок-схема второго примера
Переключатель switch является наиболее удобным средством для организации мультиветвления. Синтаксис переключателя таков:
switch ( переключающее_выражение){
case константное_выражение_1: оператор_1;
case константное_выражение_2: оператор_2;
…
case константное_выражение_N: оператор_N;
default: операторы;
}
где оператор_1 … оператор_N – одиночный, составной или блочный оператор. Управляющая конструкция switch передаёт управление к тому из помеченных с помощью case операторов, для которого значение константного выражения совпадает со значением переключающего выражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значение константных выражений, помещённых за служебным словом case, приводится к типу переключающего выражения. В одном переключателе все константные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенный в фигурные скобки, после конструкции switch( ) может быть помечен одной или несколькими метками вида
case константное_выражение:
Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default:. В каждом переключателе должно быть не больше одной метки default, однако эта метка может и отсутствовать. В случае отсутствия метки default при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.
Сами по себе метки case константное_выражение: и default: не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выходы из переключателя с помощью break, goto, return, то в нём последовательно выполняются все операторы, начиная с той метки, на которую передано управление. Пример программы с переключателем:
//Программа 4.1
#include "stdafx.h"
#include <iostream> //1
void main(){ //2
int ic; //3
std::cout<<"\n Input any decimal digit: "; //4
std::cin >> ic; //5
switch(ic%2){ //6
case 0: std::cout<< "\n Input an even number"; break;//7
case 1: std::cout<< "\n Input an odd number"; break;//8
default: std::cout<< "\n it is not known ic = "<<ic; //9
} //10
getchar();
} //11
Программа выводит на экран строку о том, чётное или нечётное число введено с клавиатуры. Забегая вперёд, скажем, что с помощью оператора break передаётся управление на оператор, сразу следующий за телом переключателя switch, т.е. на строку 11.
