- •Часть 1
- •Практическое занятие 1. Работа в среде Microsoft Visual Studio
- •Проекты и решения
- •Создание консольного приложения
- •Отладка в Visual Studio
- •Отладка программ
- •Практическое занятие 3. Операции и выражения. Линейные программы Операции и выражения
- •Логические операции
- •Поразрядные (побитовые) операции
- •Практическое занятие 4. Разветвляющиеся алгоритмы
- •If (выражение) оператор_1 else оператор_2
- •Операции сравнения (отношения)
- •Тернарная (условная) операция
- •Выражение_1 ? выражение_2 : выражение_3
- •Практическое занятие 5. Организация циклов. Операторы цикла
- •Оператор while
- •Оператор do…while
- •Оператор for
- •Операторы передачи управления Оператор break
- •Оператор continue
- •Указатели
- •Инициализация указателей
- •Операции над указателями
- •Одномерные массивы
- •Практическое занятие 7. Двумерные массивы. Организация работы с динамической памятью Двумерные массивы
- •Динамические массивы
- •Практическое занятие 8. Структуры. Форматный ввод/вывод данных. Структуры в языке с
- •Форматный ввод/вывод данных в стиле языка с
- •Int printf(строка_форматир-я [, список_переменных]);
- •Int scanf(const char * строка_форматирования,
- •Практическое занятие 9. Функция. Способы передачи параметров в функцию.
- •Выход из функции
- •Прототип (описание, объявление) функции
- •Рекурсия
- •Передача параметров в функцию
- •Передача массивов в качестве параметров функции
- •Практическое занятие 10. Перегрузка функций. Шаблоны функций Перегрузка функций
- •Перегрузка и область видимости
- •Шаблоны функций
- •Прототип шаблона
- •Параметры шаблона, не являющиеся типами
- •Явная специализация шаблонной функции
- •Директива #include
- •Директива #define
- •Символических констант
- •Макроимён, управляющих условной компиляцией:
- •Препроцессорные операторы # и ##
- •Директива #undef
- •Директивы условной компиляции #if, #ifdef, #ifndef
- •Вспомогательные директивы
- •Практическое занятие 12. Поразрядные операции Операции с разрядами Машинное слово
- •Представление машинных слов в программе
- •Технология работы с машинными словами
- •Поразрядная операция и
- •Поразрядная операция или
- •Операция поразрядной инверсии
- •Поразрядная операция исключающее или
- •Операция сдвиг влево
- •Операция сдвиг вправо
- •Формы представления числовых данных Целое без знака
- •Представление отрицательных чисел Дополнительный код
- •Преобразование типов операндов в выражениях
- •Стандартные программные решения Преобразование типов операндов в выражениях
- •Подсчет количества единичных битов
- •Упаковка данных полями переменной длины
- •Машинная арифметика – целые произвольной точности
- •01000 Хххххххх 00011 ххх 10000 хххххххххххххххх 00000.
- •Практическое занятие 13. Пространства имен
- •Пространство имен std
- •Приложение 1. Простые алгоритмы сортировки одномерных массивов
- •Сортировка простыми обменами (пузырьковая)
- •Сортировка простыми вставками (прямого включения)
- •Приложение 2. Создание файла с результатами препроцессорной обработки в среде Visual Studio
- •Создание файла с результатами препроцессорной обработки из командной строки
- •Приложение 3. Использование генератора случайных чисел
- •Рекомендуемая литература
- •Содержание
Практическое занятие 4. Разветвляющиеся алгоритмы
Операторы выбора (разветвляющиеся алгоритмы)
К операторам выбора, называемым операторами ветвления, относят условный оператор (if …else) бинарного ветвления и оператор-переключатель (switch) m-арного ветвления. Они служат для выбора пути выполнения разветвляющейся программы.
Синтаксис условного оператора:
If (выражение) оператор_1 else оператор_2
выражение должно быть простым (скалярным) и может иметь логический тип, арифметический тип или тип указателя. Если арифметическое выражение не равно нулю (или не есть пустой указатель), то его значение приводится к true, условие считается истинным и выполняется оператор_1. В противном случае, когда выражение равно нулю (false), выполняется оператор_2. В качестве операторов нельзя использовать описания и определения. Однако могут быть составные операторы и блоки.
Допустима сокращенная форма условного оператора, в которой отсутствует ветвь else и оператор_2. В этом случае при ложном значении выражения выполняется оператор, следующий за условным оператором.
Операторы оператор_1 и/или оператор_2, в свою очередь, могут быть условными (как полными, так и сокращёнными), что позволяет организовать цепочку проверок условий любой глубины вложенности. Синтаксис языка предполагает, что при вложениях условных операторов каждое else соответствует ближайшему к нему предшествующему if.
Рассмотрим программу, в которой вводятся с клавиатуры два целых числа. Если второе число отлично от нуля, то выполняется целочисленное деление.
// Листинг 4.1
#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "Input 2 digits: ";
cin >> a >> b; // Ввод двух чисел с клавиатуры
// Выполнение целочисленного деления
if (b) cout << "a/b = " << a/b << endl;
else cout << "Error!!!\n";
return 0;
}
Если b равно 0, то выражение в операторе if является ложным, и выполняется ветвь else. В противном случае условие является истинным, и выполняется деление a/b.
Результат выполнения программы:
Input 2 digits: 4 5
a/b = 0
или
Input 2 digits: 10 0
Error!!!
Оператор-переключатель является наиболее удобным средством для организации множественного (мульти-) ветвления. Синтаксис переключателя:
switch (переключающее_выражение)
{
case константное_выражение_1: оператор_1;
case константное_выражение_2: оператор_2;
…
case константное_выражение_n: оператор_n;
default: операторы;
}
Управляющая конструкция switch передаёт управление тому из помеченных с помощью case операторов, для которого значение константного_выражения совпадает со значением переключающего_выражения. Значение переключающего_выражения должно быть целочисленным или приводиться к целому. Значения константных выражений, помещаемых за словами case, также приводятся к целому типу переключающего выражения. В одном переключателе все константные выражения должны быть одного типа и иметь различные значения.
Оператор каждой ветви case и ветви default может быть как отдельным оператором, так и составным или блоком (в нём могут находиться описания переменных, область видимости которых – этот блок). В конце составного оператора каждой ветви следует использовать оператор break, т.к. в противном случае выполнятся все операторы всех ветвей, расположенных после выбранной.
Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default. В каждом переключателе должно быть не больше одной метки default, однако эта метка может отсутствовать. В случае отсутствия метки default при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов. Если не предусмотрены переходы или выходы из переключателя, то в нём последовательно выполняются все операторы, начиная с той метки, которой передано управление.
После switch() может находиться любой оператор (не обязательно составной), помеченный с использованием служебного слова case. Однако без фигурных скобок такой оператор может быть только один, и смысл переключателя теряется: он превращается в разновидность сокращённого условного оператора.
Рассмотрим программу, в которой выводятся названия нечётных десятичных цифр, не меньших введённой с клавиатуры.
// Листинг 4.2
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Enter decimal digit: ";
cin >> n;
switch(n) {
case 0: case 1: cout << "one, ";
case 2: case 3: cout << "three, ";
case 4: case 5: cout << "five, ";
case 6: case 7: cout << "seven, ";
// Выход из переключателя по оператору break
case 8: case 9: cout << "nine\n"; break;
default: cout <<"Error! It isn't digit!\n";
} // Конец переключателя
return 0;
}
Результат выполнения программы:
Enter decimal digit: 3
three, five, seven, nine
Если необходимо, чтобы выполнялись операторы лишь одной ветви case переключателя, нужно в конце каждой ветви использовать оператор break.
