Инструкции выбора в языке C++
Контрольная работа, 27 Октября 2013, автор: пользователь скрыл имя
Краткое описание
В языке С++ такие понятия как операторы безусловного перехода (типа goto), ветвления (типа if), организации циклов (типа for, while) принято называть инструкциями, а операторы С++ были в основном рассмотрены на предыдущей лекции.
Специфика С++ такова, что объявление является инструкцией, а оператор присваивания и оператор вызова функции являются выражениями.
Прикрепленные файлы: 1 файл
lekc6.doc
— 80.50 Кб (Скачать документ)Основы алгоритмизации и программирования Лекция 6
1. Инструкции выбора в языке C++
В языке С++ такие понятия как операторы безусловного перехода (типа goto), ветвления (типа if), организации циклов (типа for, while) принято называть инструкциями, а операторы С++ были в основном рассмотрены на предыдущей лекции.
Специфика С++ такова, что объявление является инструкцией, а оператор присваивания и оператор вызова функции являются выражениями.
!!! Объявления разрешается помещать в любом месте, где допустима инструкция и, кроме того, можно их размещать в условиях и в for-инструкциях.
Для организации ветвлений в языке предусмотрены инструкции выбора if и switch, которые имеют следующий синтаксис:
if (условие) инструкция
if (условие) инструкция else инструкция
switch (условие) инструкция
В данном случае в if и switch соответствующие инструкции могут быть как простыми, так и составными. Составная инструкция – это последовательность инструкций, заключенных в фигурные скобки { и }.
При использовании if (условие) инструкция следует следить за правильным размещением знака ; (точка с запятой). Например, допустима следующая инструкция: if(x>0); x=x+2; В этом случае x всегда будет увеличиваться на 2 (это связано с наличием ; перед оператором присваивания, и эта ; трактуется как пустая инструкция).
Следующая инструкция в С++ будет ошибочной:
if (x>0) x=x+2 else x=x-2; // здесь перед else отсутствует ; (точка с запятой)
if (x>0) x=x+2; else x=x-2; // правильная инструкция
if (x>0) x=x+2;; else x=x-2; // неправильная, лишняя ; (точка с запятой)
Часто удобно вводить переменные в наименьшей возможной области видимости. Например, локальную переменную лучше объявлять в тот момент, когда ей надо присвоить значение, поскольку в этом случае исключаются попытки использования переменной до момента ее инициализации. Можно в С++ объявление разместить внутри условия, например допустима следующая последовательность инструкций:
…
int y;
cin >> y;
if (int j=y) x=x*j+2;
…
Пример 1: (демонстрируется использование инструкции if)
Написать программу для определения принадлежности точки с координатами (x,y) следующей заштрихованной области (где значения a>0 и x,y вводятся с клавиатуры):
Для решения данной задачи необходимо формализовать процесс определения принадлежности точки с координатами (x,y) заштрихованной области.
Из рисунка видно, что заштрихованную область можно декомпозировать на две составляющие: во II – IV четвертях область ограничивается окружностью радиуса a с центром в точке (0,0), а в I-й четверти граница определяется отрезком прямой, проходящей через точки с координатами (a,0) и (0,a).
Очевидно, что координаты точек принадлежащих заштрихованной области должны обязательно удовлетворять условию x2+ y2<= a2. Однако для I-й четверти этого недостаточно.
Из курса школьной геометрии известно, что прямая y=kx+b разбивает плоскость на две полуплоскости, причем для всех точек из одной полуплоскости выполняется неравенство y<kx+b, а в другой полуплоскости выполняется неравенство y>kx+b. В данном случае необходимо построить уравнение прямой, проходящей через точки с координатами (a,0) и (0,a). Для этого решаем систему уравнений:
уравнение искомой прямой y=-x+a. Для удобства подставляем в левую и правую части координаты точки (0,0) и получаем: слева 0, справа 0+a. Значит, для всех точек полуплоскости выполняется неравенство y < -x+a.
Итак, чтобы точка с координатами (x,y) принадлежала заштрихованной области необходимо, чтобы выполнялась cистема неравенств: , т.е. чтобы логическое выражение (x*x+y*y<=a*a) && (y<=-x+a) имело значение true.
Алгоритм решения задачи:
- Ввести значение параметра a и координаты точки x и y;
- Вывести фразу ТОЧКА С КООРДИНАТАМИ (***, ***)
- Если логическое выражение !((x*x+y*y<=a*a) && (y<=-x+a)) имеет значение true, то вывести НЕ;
- Вывести ПРИНАДЛЕЖИТ ЗАШТРИХОВАННОЙ ОБЛАСТИ;
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
double a,x,y; // определяем три переменные для размещения
// значений параметра а и координаты точки
cout << "Введите a,x,y:";
cin >> a >> x >> y; // Вводим значение параметра а и
// координаты точки
cout << "\nТочка с координатами (" << x << ',' << y << ')';
// проверка условия на НЕПРИНАДЛЕЖНОСТЬ заштрихованной области
if (!(x*x+y*y <= a*a && y <= -x+a)) cout << " НЕ";
cout << " ПРИНАДЛЕЖИТ ЗАШТРИХОВАННОЙ ОБЛАСТИ\n\n";
return 0;
}
Пример 2: (демонстрируется вложение инструкций if)
Написать программу для вычисления значения функции f(x), где:
1) f(x)=sin(x), если x <= –10;
2) f(x)=cos(x), если x>=+10;
3) f(x)=x2, если x находится в интервале от –10 до +10.
Алгоритм решения задачи:
- Ввести значение аргумента x;
- Если x <= -10.0, то f=sin(x) и перейти на шаг 4);
- Если -10.0 < x <+10.0, то f= x2, а иначе f=cos(x);
- Вывести полученное значение f.
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
double x,f;
cout << "Введите x:"; cin >> x;
if (x<=-10.0) f=sin(x);
else
if (x>-10.0 && x<10.0) f=x*x;
else f=cos(x);
cout << "Результат: f(" << x << ")=" << f << endl;
return 0;
}
В инструкции switch (условие) инструкция обычно используется составная инструкция, содержащая метки case и необязательную метку default. Каждая метка case должна быть уникальна, а синтаксис case таков:
case целое_постоянное_выражение :
Обычно действие, выполняемое после каждой метки case, заканчивается инструкций break. Если break отсутствует, то управление передается или следующей инструкции, идущей за очередным case, или default.
Пример 3: (фрагмент программы с инструкцией switch)
…
int ocenka_examen;
…
switch ( ocenka_examen)
{
case 10: case 9: cout << “Экзамен сдан отлично”; break;
case 8: case 7: case 6: cout << “Экзамен сдан успешно”; break;
case 5: case 4: cout << “Экзамен сдан”; break;
default: cout << “Экзамен не сдан!”;
}
…
Правила выполнения switch:
1. Вычисляется выражение в круглых скобках, стоящих за служебным словом switch;
2. Выполняется метка case, совпадающая с тем значением, которое было найдено на предыдущем этапе. Если нет ни одной соответствующей метки case, то выполняется метка default. Если же метки default нет, то ничего не выполняется, а инструкция switch заканчивается;
3. Выполнение switch прерывается, когда встречается инструкция break или когда достигается конец switch.
Пример 4: (демонстрируется использование инструкции switch)
Написать программу для вывода сезона года по введенному номеру месяца.
Алгоритм решения задачи:
- Ввести номер месяца nomer_mes;
- Если nomer_mes == 1 || 2 || 12, вывести ЗИМА;
- Если nomer_mes == 3 || 4 || 5, вывести ВЕСНА;
- Если nomer_mes == 6 || 7 || 8, вывести ЛЕТО;
- Если nomer_mes == 9 || 10 || 11, вывести ОСЕНЬ;
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Russian");
short nomer_mes;
cout << "Введите номер месяца:"; cin >> nomer_mes;
switch (nomer_mes)
{
case 12: case 1: case 2: cout << "ЗИМА"; break;
case 3: case 4: case 5: cout << "ВЕСНА"; break;
case 6: case 7: case 8: cout << "ЛЕТО"; break;
default: cout << "ОСЕНЬ";
};
cout << endl;
return 0;
}