- •Введение.
- •Переменные, основные типы и операции над ними. Ввод/вывод.
- •Управление выводом информации на экран
- •Операторы ветвления
- •Условный оператор if
- •Оператор Switch.
- •Операторы цикла
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Цикл с параметром (for)
- •Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •Случайные числа
- •Вложенные циклы.
- •Массивы
- •Указатели.
- •Динамические массивы
- •Многомерные массивы
- •Строки
- •Типы пользователя
- •Перечисления (enum)
- •Функции
- •Приложение
- •Рекомендуемая литература.
Одесский колледж компьютерных технологий "СЕРВЕР"
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