
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Проблемы соответствия if и else во вложенных ветвлениях
Программируя вложенные ветвления, часто можно перепутать, к какому из операторов if относится блок else. Существует правило: else связан с последним (ближним) из операторов if, который не имеет своего собственного блока else. Если необходимо связать else с тем if, который расположен раньше, нужно использовать фигурные скобки. Пример:
-
if (…)
if (…)
оператор;
else оператор;
if (…) {
if (…)
оператор;
}
else оператор;
Условная операция
В программировании существует распространённая ситуация, когда переменной необходимо присвоить одно значение в случае выполнения некоторого условия и другое значение в случае невыполнения этого условия. В этой ситуации очень удобно применять специальную условную операцию.
-
if (b>a)
max = b;
else
max = a;
max = (b>a) ? b : a;
Оператор switch
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Если в программе будет большое дерево ветвлений и все ветвления зависят от значения какой-либо одной переменной, то вместо ступенчатой последовательности конструкций if…else целесообразно применять оператор switch. Таким образом, оператор switch предпочтительнее применять в тех случаях, когда в программе требуется разветвить вычисления на количество направлений, большее двух, и выражение, по значению которого производится переход на ту или иную ветвь, является целочисленным. Синтаксис этой конструкции следующий:
switch (n) { // n – целочисленная или символьная переменная
case константа_1:
оператор;
оператор;
break;
case константа_i:
оператор;
оператор;
break;
default: //в случае синтаксической ошибки в слове default сообщение об ошибке не выдаётся
оператор;
оператор;
}
За ключевым словом switch следуют скобки, содержащие имя переменной (или выражение), от значений которой зависит дальнейшее выполнение программы. Тип констант, употребляемых в операторах case, должен совпадать с типом переменной, стоящей в скобках оператора switch (). Все константы должны иметь разные значения, но быть одного и того же типа.
В конце последовательности операторов каждой из case-секций помещён оператор break, который завершает выполнение ветвления switch. Управление в этом случае передаётся первому оператору, следующему за конструкцией switch. При отсутствии оператора break управление будет передано операторам, относящимся к другим веткам switch. Ко всему прочему, оператор break также используется для принудительного выхода из любых типов циклов.
Если значение переменной в операторе switch не совпадёт ни с одним из значений констант, указанных внутри ветвления, то управление будет передано операторам, расположенным после слова default (а при его отсутствии управление передаётся следующему за switch оператору).
Рассмотрим пример программы, реализующей простейший калькулятор на 4 действия:
int main() {
float a, b, res;
char op; // знак операции
cout << "Vvedite cherez probel 1 operand, znak operacii, 2 operand: ";
cin >> a >> op >> b;
switch (op) {
case '+': res = a + b;
break;
case '-': res = a - b;
break;
case '*': res = a * b;
break;
case '/': res = a / b;
break;
default : cout << "\nBudte vnimatelnee! Neizvestnaya operaciya.";
res = 0;
}
cout << "\n Rezultat: " << res;
getch(); return 0;
}
Данная программа никак не застрахована от фатальной ошибки, связанной с делением на ноль. Сделаем следующие исправления:
int main() {
float a, b, res;
char op, answer; // op - знак операции
do {
cout << "Vvedite cherez probel 1 operand, znak operacii, 2 operand: ";
cin >> a >> op >> b;
switch (op) {
case '+': res = a + b;
break;
case '-': res = a - b;
break;
case '*': res = a * b;
break;
case '/': if (b == 0) {
cout << "Error: delitel = 0 !" << endl;
continue; // или просто res = 0;
}
else res = a / b;
break;
default : cout << "\nBudte vnimatelnee! Neizvestnaya operaciya.";
res = 0;
}
cout << "\n Rezultat: " << res;
cout << "\nProdolgite vychisleniya?(y/n): "; cin >> answer;
} while(answer == 'y');
return 0;
}
В данной версии программы, мы применили оператор перехода continue. Применение этого оператора очень полезно, когда необходимо при определённом условии не выходить из цикла, а досрочно возвращаться в его начало.