Материал: Sb98050

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

рования о том, что у функции нет возвращаемого значения либо в качестве базового типа указателя на объекты неопределенных типов:

void object; // ошибка, не существует объектов типа void void &reference; // ошибка, не существует ссылок на void void *ptr; // ok, храним указатель на неизвестный тип

Часто мы будем использовать void именно для обозначения того, что функция не возвращает никакого значения. С указателем типа void работают, когда программист полностью берет на себя заботу о целостности памяти и правильном приведении типа.

1.3. Приведение типов

Часто бывает необходимо привести значение переменной одного типа к другому. В случае, когда множество значений исходного типа является подмножеством большего типа (например, int является подмножеством long, а long – double), компилятор способен неявно (implicitly) изменить тип значения.

int integer = 2;

float floating = integer; // floating = 2.0

Обратное приведение типа будет выполнено с потерей информации: так, от числа с плавающей точкой останется только целая часть, дробная будет потеряна.

Существует возможность явного (explicitly) преобразования типов. Для этого слева от переменной или какого-либо значения исходного типа в круглых скобках пишут тип, к которому будет произведено приведение:

int value = (int) 2.5.

1.4. Унарные и бинарные операции

Операции, которые мы выполняли ранее, называют бинарными: слева и справа от символа операции находятся значения или переменные, например, 2 + 3. В языках программирования помимо бинарных операций также используют унарные операции, которые применяются к переменным. Они могут находится как слева, так и справа от переменной. Несколько таких операций встречались ранее: операция разыменовывания (*) и взятие адреса переменной (&) являются унарными. Операторы «++» и «--» увеличивают и уменьшают значение целочисленной переменной на 1 соответственно, причем могут писаться либо слева, либо справа от переменной.

11

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

a += 2; // то же самое, что и a = a + 2; b /= 5; // то же самое, что и b = b / 5; c &= 3; // то же самое, что и c = c & 3;

2. ВЫПОЛНЕНИЕ ПРОГРАММЫ

2.1. Понятие программы

Компьютерная программа – это последовательность инструкций, которые компьютер (вычислительная машина) будет исполнять. Иногда под программой понимают исходный код этой программы. Когда пользователь компьютера «запускает программу», он создает так называемый процесс, который соответствует этой программе. Процесс – выполнение инструкций программы. Кроме того, каждый процесс может иметь один или несколько потоков выполнения (англ. thread). Этот курс не подразумевает использования нескольких потоков, поэтому понятия «процесс» и «поток» будут взаимозаменяемыми.

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

int main() { return 0;

};

Фигурные скобки {} в С++ используются для группировки. В данном случае они указывают на начало и конец функции main, которая обязательно должна присутствовать в программе и с которой начинается ее работа. Точка с запятой (;) ставится после каждого оператора языка, например, после оператора return, возвращающего значение 0 и таким образом завершающего программу. Целое значение, с которым завершается программа, называется кодом ошибки. Если код ошибки 0, то такая программа завершилась успешно.

Разберем следующий код:

int main() {

int addOne = 6; int addTwo = 8;

12

return 0;

int sum = addOne + addTwo;

};

Внутри блока объявляются три переменные: addOne, addTwo и sum. Так как объявление переменной sum стоит после оператора return, то программа завершится еще до того, как сможет узнать о существовании переменной sum. Таким образом, sum не будет ни создана, ни инициализирована.

2.2. Операторы ветвления (выбора)

Часто бывает необходимо выполнить (или не выполнить) последовательность команд в зависимости от осуществления какого-либо условия. К примеру, модуль любого числа равен самому числу, если оно не меньше 0, и самому числу, взятому с обратным знаком, в противном случае:

Перепишем это условие на языке C++:

int main() {

int value = 6;// Исходное значение X int result;// Сюда сохраним результат if (value >= 0) { // Если X ≥ 0,

result = value; // тогда сохраняем само число

} else { // Иначе

result = -value; // его же, взятым с обратным знаком

}; return 0;

};

Ветвь else является необязательной. В этом случае оператор if ограничивает блок кода, который может быть выполнен только при наступлении определенного условия. Операторы if могут быть вложенными. Это позволяет использовать два и более ограничений. Листинг 4 реализует вычисление результата для следующей функции:

int main() {

int value = 6; int result = 0;

13

if (value >= 1) { result = value - 1;ы

}else if (value < -1) { result = -value - 1;

}else {

result = 0;

}; return 0;

};

В этом примере во внешнем блоке if (value >= 1) в части else располагается внутренний блок if (value < −1). Внешний блок выбирает все значения, не меньшие 1, тогда как внутренний делит оставшееся множество (т. е. все значения, меньшие 1) на два: на множество значений, меньшие −1, и множество, не меньшее −1 и меньшее 1.

Кроме оператора if существует оператор выбора switch:

int main() { char op = ‘-’;

float result = 0.0; float a = 4.0, b = 3.0; switch (op) {

case ‘+’: result = a + b; break; case ‘-’: result = a - b;

case ‘*’: result = a * b; break; case ‘/’: result = a / b; break; default: /* Вывести ошибку */;

};

return 0;

};

В круглых скобках после switch записывается любая переменная целого типа (или типа, который может быть представлен, как целочисленный). В фигурных скобках перечисляются значения, с которыми будет происходить сравнение переменной. Выполнение начнется с той ветви, в которой произошло совпадение (в примере это ‘–’). Оператор break устанавливается для того, чтобы поток программы закончил выполнение ветвей и продолжил работу за закрывающейся фигурной скобкой. Поэтому в приведенном примере забытый оператор break приведет к ошибке, так как после того, как будет вычислена разность, поток программы перейдет на следующую ветвь и выполнит умножение.

14

Необязательная ветвь default выполнится в том случае, если значение переменной не совпало не с одним из перечисленных в case-ветвях.

2.3. Циклы

Циклы позволяют выполнять один и тот же блок кода, пока выполняется определенное условие. В языке C++ существует три цикла: while, for и do-while. Первые два являются циклами с предусловием, последний – с постусловием. Когда некоторое логическое условие цикла истинно, то начинает выполняться тело цикла. Программисту необходимо следить, чтобы цикл мог когда-нибудь закончиться, т. е. рано или поздно логическое условие должно стать ложным, иначе программа «зациклится».

Цикл while трактуется так: «Пока логическое условие верно, выполнять блок кода». В коде синтаксически записывается следующим образом:

int main() {

string text = “So beautiful text!”; int pos = 0;

while (text[pos] != ‘t’) { pos++;

};

return 0;

};

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

Синтаксис оператора цикла for следующий:

int main() {

int arr1[] = {2, 5, 7}; int arr2[3];

for (int i = 0; i < 3; i++) { arr2[i] = arr1[i];

};

return 0;

};

Оператор цикла for в данном случае имеет следующее значение: «Присвоить переменной i значение 0; пока i меньше 3-х, копировать i-й элемент массива и увеличить i на 1». Все три части оператора (присвоение перемен-

15