Операнд_1 ? операнд_2 : операнд_3 2 глава




Операция логического И (&&). Логическая операция И используется в том случае, когда требуется одновременность выполнения двух условий, входящих в данную операцию. В языке C++ данное выражение может быть представлено следующим образом

<условие 1> && <условие 2>

На практике эта логическая операция часто применяется для создания условия, что некоторая переменная принадлежит указанному промежутку. Например, составим условие, которое будет истинно тогда и только тогда, когда переменная х принадлежит промежутку от 10 до 20: 10 < x < 20. Это произойдёт только в том случае, когда х >10 и x < 20. На языке C++ это записывается так:

 

x > 10 && x < 20

Операция логического ИЛИ (||). Логическая операция ИЛИ используется только в том случае, когда требуется выполнение хотя бы одного из условий, входящих в данную операцию. В языке C++ данное выражение может быть представлено следующим образом:

 

<условие 1> || <условие 2>

 

На практике эта логическая операция часто применяется для создания условия, что некоторая переменная принимает одно из допустимых значений. Например, составим условие, которое истинно тогда и только тогда, когда x принимает фиксированные значения: 1,2; 2,3; 3,4. Это произойдет только в том случае, когда x = 1,2 или x = 2,3 или x = 3,4. На языке C++ это запишется как

 

x == 1.2 || x == 2.3 || x == 3.4

Операция логического НЕ (!). Операция НЕ принимает значение истина, если ее операнд принимает значение ложь, и наоборот, результатом операции НЕ будет ложь, если ее операнд принимает значение истина. В языке C++ данное выражение может быть представлено следующим образом:

 

! <условие>

 

На практике операция НЕ применяется для отрицания какого-либо факта.

Все логические операции (за исключением операции логического НЕ) имеют приоритет ниже операций отношения, поэтому обрамлять скобками простые условия на основе операторов отношения не обязательно.

Примеры:

 

if (a<0) b = 1; // 1

if (a<b && (a>d||a==0)) b++;

else

{

b*=a;

a=0;

} // 2

if (a<b)

{

if (a<c) m = a;

else m = c;

}

else

{

if (b<c) m = b;

else m = c;

} // 3

if (a++) b++; // 4

if (b>a) max = b;

else max = a; // 5

В примере 1 отсутствует ветвь else. Подобная конструкция называется «пропуск оператора», поскольку присваивание либо выполняется, либо пропускается в за­висимости от выполнения условия.

Если требуется проверить несколько условий, их объединяют знаками логиче­ских операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a<b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом - ИЛИ.

Оператор в примере 3 вычисляет наименьшее значение из трех переменных. Фи­гурные скобки в данном случае не обязательны, так как компилятор относит часть else к ближайшему if.

Пример 4 напоминает о том, что хотя в качестве выражений в операторе if чаще всего используются операции отношения, это не обязательно.

Конструкции, подобные оператору в примере 5, проще и нагляднее записывать в виде условной операции (в данном случае: max=(b>a)?b:a;).

Условный оператор. Условный оператор if используется для разветвления процесса вычислений на два направления.

       
   


true false false

           
     
 


Оператор
Оператор 2
Оператор 1
true

 

       
   
 

 


Рисунок 2.4 - Структурная схема условного оператора

 

Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется пер­вый оператор, иначе - второй. После этого управление передается на оператор, следующий за условным.

Одна из ветвей может отсутствовать, логичнее опускать вторую ветвь вместе с ключевым словом else. Если в какой-либо ветви требуется выполнить несколь­ко операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из од­них описаний). Необходимо учитывать, что переменная, описанная в блоке, вне блока не существует.

Условный оператор в языке C++ имеет формат:

 

if(<Условие>) <Оператор>;

 

его действие можно описать с помощью фрагмента UML-диаграммы деятельности, изображенного на рис. 2.5 а:

 

а) б)

Рисунок 2.5 - Фрагмент диаграммы деятельности UML, описывающей действия оператора if в языке C++: а) без альтернативной ветви else;

б) с альтернативной ветвью else

 

Если помимо тех действий, которые требуется выполнить, когда заданное условие истинно, требуется исполнить и ряд действий, когда заданное условие ложно, то применяют следующую форму условного оператора:

 

if(<Условие>) <Оператор_1>; else <Оператор_2>;

 

его действие можно описать с помощью фрагмента блок-схемы алгоритма, изображенного на рис. 2.5 б. Иными словами, если «условие» принимает значение «истина», то выполняется «оператор1», и если «условие» принимает значение «ложь», то выполняется «оператор2».

Например, для оператора if без альтернативной ветви else можно привести следующий фрагмент кода:

// Условный оператор

if(temperature >= 0)

cout << "Выше точки замерзания!\n";

// Действия, не относящиеся к условному оператору

cout << "Температура " << temperature << endl;

тогда как для оператора if-else можно привести следующий пример:

 

// Условный оператор

if(x < у) min = х;

else min = у;

// Действия, не относящиеся к условному оператору

cout <<"min = " << min;

 

Последний пример может быть прокомментирован следующим образом. Если условие x < у истинно, то переменной min будет присвоено значение х, если оно ложно, то min будет присвоено значение у. После выполнения инструкции if-else будет напечатано значение min.

Оба оператора <Оператор_1> и <Оператор_2> могут представлять простые операторы (один оператор), в этом случае они не заключаются в фигурные скобки. Если же <Оператор_1> и/или <Оператор_2> представляют составной оператор (несколько операторов), то их нужно заключить в фигурные скобки.

{

Оператор_1;

Оператор_2;

...

Оператор_n;

}

 

Каждый оператор внутри скобок должен заканчиваться точкой с запятой.

Структура называется вложенной, если после <условия> или служебного слова else используются вновь условные операторы. Число вложений может быть произвольным. При этом справедливо следующее правило: служебное слово else всегда относится к ближайшему выше <условию>.

 

Пример 2.1. Составить UML-диаграмму деятельности и программу с использованием конструкции ветвления для вычисления значения функции:

(3.1)

Составим UML-диаграмму деятельности вычисления значения функции (рис. 2.6).

 

Рисунок 2.6 - UML-диаграмма деятельности для задачи расчета значения функции

 

По составленной диаграмме может быть написана программа вычисления значения функции.

 

Листинг 2.1

#include “stdafx.h”

#include <iostream>

#include <math.h>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

double x, y;

 

setlocale(LC_ALL, "Russian");

cout << ”Введите x: ”;

cin >> x;

 

if (x <= 0)

y=2*x*x + cos(x);

else

if (x<5) y = x + 1;

else y = sin(x) - x*x;

cout << “y(x = ” << x << “) = ” << y << endl;

getch();

return 0;

}

Переключатель. Оператор switch (переключатель) предназначен для разветвления процесса вы­числений на несколько направлений. Переключатель является наиболее удобным средством для органи­зации мультиветвления. Синтаксис переключателя таков:

 

switch(Выражение)

{

case Константа_1: Операторы_1;

case Константа_2: Операторы_2;

...

case Константа_n: Операторы_n;

default: Операторы_(n+1);

}

 
 

 

 


Рисунок 2.7 - Структурная схема оператора switch

 

Выполнение оператора начинается с вычисления выражения (оно должно быть целочисленным), а затем управление передается первому оператору из списка, помеченного константным выражением, значение которого совпало с вычислен­ным. После этого, если выход из переключателя явно не указан, последовательно выполняются все остальные ветви.

Выход из переключателя обычно выполняется с помощью операторов break или return. Оператор break выполняет выход из самого внутреннего из объемлющих.

Управляющая конструкция switch передает управление к тому из помеченных с помощью case операторов, для которого значение кон­стантного выражения совпадает со значением переключающего вы­ражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значения константных выра­жений, помещаемых за служебными словами case, приводятся к типу переключающего выражения. В одном переключателе все констант­ные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенных в фигурных скобках после конструкции switch(...), может быть помечен одной или несколь­кими метками вида

case константное_выражение:

Если значение переключающего выражения не совпадает ни с од­ним из константных выражений, то выполняется переход к оператору, отмеченному меткой default:. В каждом переключателе должно быть не больше одной метки default, однако эта метка может и отсутство­вать. В случае отсутствия метки default при несовпадении переклю­чающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.

Сами по себе метки case и default не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление. Фрагмент UML-диаграммы деятельности, соответствующий переключателю, изображен на рис. 2.8.

Пример 2.2. Написать программу вывода нечетных чисел, не меньших чем введенное с клавиатуры число от 0 до 9.

 

Листинг 2.2

// Названия нечетных целых цифр не меньше заданной

#include “stdafx.h”

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

int ic;

setlocale(LC_ALL, "Russian");

cout << “\nВведите любую десятичную цифру: ”;

cin >> ic;

cout << endl;

switch(ic)

{

case 0: case 1: cout << “один, ”;

case 2: case 3: cout << “три, ”;

case 4: case 5: cout << “пять, ”;

case 6: case 7: cout << “семь, ”;

case 8: case 9: cout << “девять. ”;

// Выход из переключателя

break;

default: cout << “Ошибка! Это не цифра!\n”

// Конец переключателя

}

getch();

return 0;

}

 

В результате двух выполнений программы:

 

Введите любую десятичную цифру: 4 <Enter>

пять, семь, девять.

 

Введите любую десятичную цифру: z <Enter>

Ошибка! Это не цифра!

 

Рисунок 2.8 - Фрагмент диаграммы деятельности UML, описывающей действие оператора switch в языке C++

 

Кроме сказанного о возможностях переключателя, приведенная программа иллюстрирует действие оператора break. С его помощью выполняется выход из переключателя. Если поместить операторы break после вывода каждой цифры, то программа будет печатать на­звание только одной нечетной цифры.

Несмотря на то, что в формате переключателя после конструкции switch() приведен составной оператор, это не обязательно. После switch() может находиться любой оператор, помеченный с исполь­зованием служебного слова case. Однако без фигурных скобок такой оператор может быть только один, и смысл переключателя теряется: он превращается в разновидность сокращенного условного операто­ра.

Совместно с оператором break синтаксис переключателя имеет следующий вид:

 

switch(Выражение)

{

case Константа_1: Операторы_1; break;

case Константа_2: Операторы_2; break;

...

case Константа_n: Операторы_n; break;

default: Операторы_(n+1);

}

 

его действия можно описать с помощью фрагмента блок-схемы алгоритма, изображенного на рис. 2.9.

 

Рисунок 2.9 - Фрагмент диаграммы деятельности UML, описывающей действие оператора switch совместно с оператором break в языке C++

 

Пример 2.3. Составить блок-схему алгоритма и программу с использованием переключателя и вывести наименование времени года по вводимому с клавиатуры номеру месяца от 1 до 12.

Составим UML-диаграмму деятельности определения наименования времени года по вводимому с клавиатуры номеру месяца (рис. 2.10).

 

Рисунок 2.10 - UML-диаграмма деятельности для задачи вывода названия времени года по номеру месяца

На UML-диаграммах деятельности логическое отношение И в условии обозначается с помощью связки and, логическое отношение ИЛИ - с помощью связки or, а логическое отрицание НЕ - c помощью связки not.

По составленной диаграмме может быть написана программа решения поставленной задачи.

 

Листинг 2.3

#include “stdafx.h”

#include <iostream>

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

int n;

 

setlocale(LC_ALL, "Russian");

cout << "Введите номер месяца: ";

cin >> n;

cout<<"\nВремя года: ";

 

switch(n)

{

case 1:case 2:case 12: cout << "Зима\n";

break;

case 3:case 4:case 5: cout << "Весна\n";

break;

case 6:case 7:case 8: cout << "Лето\n";

break;

case 9:case 10:case 11: cout << "Осень\n";

break;

default: cout << "\Ошибка!\n";

}

 

getch();

return 0;

}

 

В приведенном примере программы при вводе номера месяца от 1 до 12 на экране печатается соответствующее время года, если же номер месяца превышает 12, выводится сообщение о неверном вводе месяца, для чего служит зарезервированное слово языка default. После каждой из констант, перечисляющих значение переключателя, ставится двоеточие.

Заключительный для каждой ветви оператор break служит для прерывания цикла проверки и перехода в конец переключателя. В случае отсутствия break переключатель работает неверно - происходит переход на следующую ветвь.

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15². Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.

Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Порядок выполнения работы:

1. Проработать примеры, приведенные в лабораторной работе.

2. Для программы из примера 2 составить соответствующую ей диаграмму деятельности UML.

3. Составить UML-диаграмму деятельности и программу с использованием конструкции ветвления и вычислить значение функции. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №1. Вариант:

1. где ;

2. где ;

3.

4. где ;

5. где ;

6.

7. где ;

8.

9. где ;

10.

11. где ;

12. где ;

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

 

4. Решить задачу согласно варианта, составить UML-диаграмму деятельности и программу с использованием переключателя. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №2. Вариант:

1. Дано натуральное число n > 100. Вывести на экран фразу «Мне n лет», учитывая, что при некоторых значениях n слово «лет» надо заменить на слово «год» или «года».

2. Дано число m (1 £ m £ 12).Определить, сколько дней в месяце с номером m.

3. Дано число m (1 £ m £ 7). Вывести на экран название дня недели, который соответствует этому номеру.

4. С клавиатуры вводится натуральное число n. В зависимости от значения остатка r при делении числа n на 7 вывести на экран число n в виде n = 7*k + r.

5. С клавиатуры вводится цифра m (от 1 до 4). Вывести на экран названия месяцев, соответствующих времени года с номером m (считать зиму временем года № 1).

6. Дано целое число С такое, что |С| < 9. Вывести это число в словесной форме, учитывая его знак.

7. С клавиатуры вводится цифра m (от 1 до 12). Вывести на экран название месяца, соответствующего цифре,

8. Дано число m (1£ m £ 12). Определить полугодие, на которое приходится месяц с номером m и количество дней в том месяце (год не високосный).

9. Вводится число экзаменов N<=20. Напечатать фразу "Мы успешно сдали N экзаменов", согласовав слово "экзамен" с числом N.

10. Вводится число карандашей N<=10. Вывести фразу "Я купил N карандашей, согласовав слово "карандаш" с числом N.

11. Компания по снабжению электроэнергией взимает плату с клиентов по тарифу:

- 7 р. за 1 кВт/ч за первые 250 кВт/ч;

- 17 р. за кВт/ч, если потребление свыше 250, но не превышает 300 кВт/ч;

- 20 р. за кВт/ч, если потребление свыше 300 кВт/ч.

Потребитель израсходовал n кВт/ч. Подсчитать плату.

12. При покупке товара на сумму от 200 до 500 руб предоставляется скидка 3%, при покупке товара на сумму от 500 до 800 - скидка 5%, при покупке товара на сумму от 800 до 1000 руб - скидка 7%, свыше 1000 руб - скидка 9%. Покупатель приобрел 8 рулонов обоев по цене Х1 и две банки краски по цене Х2. Сколько он заплатил?

13. Студенты убирают урожай помидоров. При сборе до 50 кг в день работа оплачивается из расчёта 30 коп. за 1 кг; при сборе от 50 до 75 кг в день - 50 коп. за 1 кг; при сборе от 75 до 90 кг в день - 65 коп. за 1 кг; при сборе свыше 90 кг в день - 70 коп. за 1 кг плюс 20 руб. премия. Студент собрал X кг за день. Определить его заработок.

5. Решить задачу согласно варианта, составить UML-диаграмму деятельности и программу с использованием конструкций ветвления и переключателя. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №3. Вариант:

1. В японском календаре был принят 60-летний цикл, состоящий из пяти 12-летных подциклов. Внутри подцикла года носили названия животных мыши, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи. Попарно года в подцикле обозначались названиями цвета: зеленый, красный, желтый, белый и черный. По номеру года определить его название по японскому календарю, считая за начало очередного цикла 1984 год - год зеленой мыши (1985 - год зеленой коровы, 1986 - год красного тигра, 1987 - год красного зайца и т.д.).

2. Даны действительные числа х и у. Найти U = max2(x2y, xy2) + min2(x-y, x+2y).

3. Из трех действительных чисел a, b и c выбрать те, модули которых не меньше 4.

4. Напечатать три данных действительных числа a, b и c сначала в порядке их возрастания, затем - в порядке убывания.

5. Определить принадлежит ли точка А(a, b) кольцу определяемому окружностями х2 + у2 = 1 и х2 + у2 = 0.25.

6. Решить квадратное неравенство ax2 + bx + c > 0 (а ¹ 0), где a, b и с - действительные числа.

7. Провести исследование биквадратного уравнения ax4 + bx2 + c = 0 (а ¹ 0), где a, b и с - действительные числа. Если действительных корней нет, то об этом должно быть выдано сообщение, иначе должны быть выданы 2 или 4 действительных корня.

8. Решить неравенство , где а - произвольное действительное числа.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: