Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Лекции по C++ ОККТ "Сервер" [12].pdf
Скачиваний:
123
Добавлен:
02.05.2014
Размер:
1.04 Mб
Скачать

Одесский колледж компьютерных технологий "СЕРВЕР"

delay (Задержка) - обеспечивает задержку на указанное количество миллисекунд.

sound(Частота) - обеспечивает вывод звукового сигнала с использованием внутреннего динамика компьютера. Частота сигнала задается в герцах. Динамик будет издавать сигнал до тех пор, пока программа его не выключит при помощи функции nosound.

nosound - выключает звуковой сигнал, издаваемый внутренним динамиком компьютера.

Операторы ветвления

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

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

Для обработки условий в С++ используется оператор if. Синтаксис его таков:

if ( выражение ) оператор_1; [else оператор_2:]

Если нам надо выполнить при истинности условия несколько операторов, мы должны заключить их в блок в скобки { ... } - это так называемый "составной оператор" (блок). Он объединяет несколько операторов в один.

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

Условный оператор может не иметь части "иначе": If (условие) оператор;

Если условие ложно, то оператор не выполняется, а сразу выполняется оператор, следующий за условным.

Пример 1.

If (x > 10)

cout << "Икс больше десяти\n";

Пример 2.

int x, y, z;

if(x < y) z = 1; else z = 2;

В качестве условий могут использоваться операторы СРАВНЕНИЯ (сравнивать можно переменные, выражения, константы)

x < y

меньше

x > y

больше

x <= y

меньше или равно

x >= y

больше или равно

14

Одесский колледж компьютерных технологий "СЕРВЕР"

x == y

равно

x != y

не равно

Все эти операторы в качестве результата операции сравнения выдают: 1, если сравнение истинно 0, если оно ложно.

Если нужно проверить выполнение двух условий одновременно, эти условия соединяют логическим И (&&). Если достаточно выполнения одного условия из двух, то эти условия соединяют логическим ИЛИ (||). Если нужно записать невыполнение условия (отрицание), используется знак !, например: !(x>3) означает x не больше 3.

В C++ условие может обрабатывать любые аргументы: переменные, арифметические операции с переменными, возвращаемые значения функций,

и даже просто числа.

 

Примеры условного оператора:

 

if (а<0) b = 1;

// 3

if (a<b && (a>d ||a==0)) b++: else {b = a; a = 0;}

// 4

if (a<b) {if (a<c) m = a; else m = c;} else {if (b<c) m = b; else m = c;}

// 5

if (a++) b++;

// 6

if (b>a) max = b; else max = a;

// 7

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

Выражение в примере 4 будет истинно в том случае, если выполнится одновременно условие а<b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом — ИЛИ.

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

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

Конструкции, подобные оператору в примере 7, проще и нагляднее записывать в виде условной операции (?:). Эта операция тернарная, то есть имеет три операнда. Ее формат:

операнд_1 ? операнд_2 : операнд_3

В данном примере: max=(b>a)?b : a;

Первый операнд оценивается с точки зрения его равенства нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора if.

15

Одесский колледж компьютерных технологий "СЕРВЕР"

if ( а < b ) с = х; else с = у;

// Нерационально

с = ( а<b ) ? х : у;

// Рекомендуется

Тернарной эта операция называется потому, что у нее три операнда. Пример 8. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала значение 1:

i = (1 < n) ? i + 1: 1;

Распространенная ошибка при записи условных операторов — ис-

пользование в выражениях вместо проверки на равенство (==) простого присваивания (=), например, if(a=l)b=0;. Синтаксической ошибки нет, так как операция присваивания формирует результат, который и оценивается на равенство/неравенство нулю. В данном примере присваивание переменной b будет выполнено независимо от значения переменной а. Поэтому в выражениях проверки переменной на равенство константе константу рекомендуется записывать слева от операции сравнения: if (1= =а)b=0;.

Вторая ошибка — неверная запись проверки на принадлежность диапазону. Например, чтобы проверить условие 0<х<1, нельзя записать его в условном операторе непосредственно, так как будет выполнено сначала сравнение 0<х, а его результат (true или false, преобразованное в int) будет сравниваться с 1. Правильный способ записи: if(0<x S&& х<1)...

Если какая-либо переменная используется только внутри условного оператора, рекомендуется объявить ее внутри скобок, например:

if (int i = 3) a -= i; else a += i;

Объявление переменной в тот момент, когда она требуется, то есть когда ей необходимо присвоить значение, является признаком хорошего стиля и позволяет избежать случайного использования переменной до ее инициализации. Объявлять внутри оператора if можно только одну переменную. Область ее видимости начинается в точке объявления и включает обе ветви оператора.

В блоке можно также объявлять локальные переменные, их областью видимости является этот блок:

if ( х < 0 ){ int i; i = 2; cout << i; }

Следует избегать проверки вещественных величин на равенство; вместо этого лучше сравнивать модуль их разности с некоторым малым числом. Это связано с погрешностью представления вещественных значений в памяти:

float a, b; ...

if ( а == b ) cout << " равны" ; else cout << " не равны"; // Не рекомендуется! if ( fabs(a - b) < le-6 ) cout << " равны" ; else cout << " не равны"; // Верно!

16

Одесский колледж компьютерных технологий "СЕРВЕР"

Оператор Switch.

Оператор switch (переключатель) предназначен для разветвления на три и более направлений, причём условием должно выступать равенство переменной (или выражения) конкретному значению.

Формат оператора: switch(переменная_или_выражение)

{

case первое_значение: одни_инструкции; case второе_значение: другие_инструкции; case третье_значение: третьи_инструкции;

. . .

. . .

default: инструкции_которые_выполнятся_в_любом_другом_случае

}

Ключевое слово case служит для того, чтобы описать каждый конкретный случай. После него ставится двоеточие.

То же самое можно было бы записать следующим образом, пользуясь только if:

if(переменная_или_выражение== первоe_значениe) {одни_инструкции;} if(переменная_или_выражение== второе_значениe){другие_инструкции;} if(переменная_или_выражение== третье_значениe) { третьи_инструкции;}

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

Switch работает по-другому. Переменная последовательно сличается с каждым возможным значением case. Если она совпала с каким-то из них, то начинают выполняться инструкции, идущие после метки. При этом компьютер не знает, где остановиться. Он выполнит все инструкции, какие ему встретятся далее. То есть, в нашем первом примере, если переменная_или_выражение оказалась равна первому_значению, то выполнятся и одни_инструкции, и другие_инструкции, и третьи_инструкции, и так далее. Например:

switch(number)

{

case 1: cout << "раз "; case 2: cout << "два "; case 3: cout << "три ";

17

Одесский колледж компьютерных технологий "СЕРВЕР"

case 4: cout << "четыре "; case 5: cout << "пять ";

default: "вышел зайчик погулять";

}

Если переменная number будет равна единице, будет выведена вся считалка, если же более, то считалка начнется соответственно с двойки, тройки и так далее. Если значение переменной number не входит в диапазон от 1 до 5, будет выведено только «вышел зайчик погулять».

Рассмотренная особенность не всегда бывает полезна и часто приводит к логическим ошибкам в программе. Для того чтобы избежать такой «цепной реакции», используется оператор break, который прерывает все действия в данных фигурных скобках {}. Вот пример этого приема:

switch(a)

{

case x: cout << "a равно x"; break; case y: cout << "a равно y"; break; case z: cout << "a равно z"; break;

default: cout <<"a не равно ни x, ни y, ни z.";

}

Если значение а совпадет c x, y или z, будет выведено соответствующее сообщение, и никакое другое. Это достигается путем использования оператора break, который сразу заканчивает все действия в фигурных скобках switch, и выполнение программы продолжится с инструкций, идущих за этими скобками (в этом примере их нет; они могли бы быть вместо слова «Если»).

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

Пример 2. Написать программу, определяющую, какая из курсорных клавиш была нажата. В составе библиотеки, унаследованной от языка С, есть функция getch ( ), возвращающая код нажатой пользователем клавиши. В случае нажатия функциональных или курсорных клавиш эта функция возвращает 0, а ее повторный вызов позволяет получить расширенный код клавиши.

#include <stdio.h> #include <conio.h> int main(){

int key;

18