- •1.1.Схема простой программы
- •1.2.Основы записи программ
- •1.2.1.Имена
- •1.2.2.Комментарии
- •1.2.3.Переменные и константы, объявления и присваивания
- •1.3.Основные конструкции: операторы, выражения, операции, операнды
- •2.1.Операторы объявления
- •2.2.“Линейные” операторы
- •2.3.Операторы управления программой
- •2.3.1.Условный оператор if (if-else)
- •2.3.2.Оператор выбора switch
- •2.3.3.Оператор цикла while
- •2.3.4.Оператор цикла do–while
- •2.3.5.Оператор цикла for
- •2.3.6.Операторы перехода break, continue и goto
- •3.1.Операция присваивания
- •3.2.Объединение действий с присваиванием
- •3.3.Операции увеличения и уменьшения на 1
- •3.4.Трактовка истинности
- •3.5.Операция ?
- •3.6.Операция «запятая»
- •3.7.Операция sizeof
- •4.1.Объявление, определение, параметры и вызов функции
- •4.2.Выход из функции
- •4.3.Организация памяти при выполнении программы
- •4.4.Правила видимости имен для функций
- •4.5.Одинаковое именование нескольких функций (перегрузка функций)
- •4.6.Параметры функций по умолчанию
- •4.7.Передача параметров функции по адресу
- •4.8.Библиотека стандартных функций
- •6.1.Целые числа
- •6.2.Вещественные числа
- •6.3.Логические значения
- •6.4.Символы
- •6.5.Преобразование типов
- •6.6.Вычисление значения выражения
- •7.1.Массивы
- •7.1.1.Одномерные массивы
- •7.1.2.Многомерные массивы
- •7.1.3.Строки
- •7.1.4.Массивы с неопределенным размером (безразмерные массивы)
- •7.2.Перечисления
4.5.Одинаковое именование нескольких функций (перегрузка функций)
Функции, выполняющие сходные действия для различных наборов входных данных логично называть одним именем. В языке C++ допустимо иметь несколько функций с одним и тем же именем, потому что функции различаются не только по именам, но и по списку типов параметров. Иногда говорят, что у этих функций разные сигнатуры.
Тип возвращаемого значения не входит в сигнатуру функции. Попытка определения двух функций с одним и тем же именем и списком типов параметров, но с разными возвращаемыми значениями приведет к ошибке компиляции.
4.6.Параметры функций по умолчанию
При объявлении функций в языке C++ имеется возможность задать значения параметров по умолчанию:
double ехр (double x, unsigned int e = 2)
{
double result = 1;
for (unsigned int i = 0; i < e; i++)
result *= x;
return result;
}
int main ()
{
double y = ехр (3.14); // 3.14 в квадрате
double x = ехр (2.9, 5); // 2.9 в пятой степени
...
}
Значение параметра по умолчанию задается либо в прототипе, либо в заголовке функции, но не в обеих этих конструкциях одновременно.
Необязательных параметров может быть несколько. Если в функции имеется необязательный параметр, то либо он должен быть последним в списке формальных параметров, либо все формальные параметры после него должны также иметь значение по умолчанию (то есть ни один обязательный параметр не должен следовать за необязательным). Если у функции несколько необязательных параметров и при вызове указано меньше значений, чем в полном списке ее параметров, используются значения по умолчанию для необязательных параметров, причем порядок применения этих значений – справа налево (то есть с конца списка).
4.7.Передача параметров функции по адресу
В языках программирования параметры подпрограммам могут передавать двумя способами. Первый – это передача параметров “по значению”. При его выполнении содержимое (значение) фактического параметра копируется в формальный параметр подпрограммы, после чего связь формального и фактического параметра прерывается. Изменения, сделанные в формальном параметре, не влияют на значение переменной, используемой при вызове. Именно этот способ и рассматривался нами ранее.
Вторым способом передачи параметров является передача “по адресу”. При использовании данного способа в формальный параметр вызываемой подпрограммы копируется адрес фактического параметра. В подпрограмме этот адрес используется для доступа к настоящему фактическому параметру, то есть, изменения, сделанные в формальном параметре, происходят в переменной, использованной при вызове.
Передача параметров “по адресу” позволяет неявно обойти ограничение, состоящее в том, что подпрограмма может возвращать не более одного результатирующего значения. Передав по адресу несколько фактических параметров, в подпрограмме можно изменить их значения, вернув таким образом в вызывающую подпрограмму несколько результатов.
В С++ второй способ передачи параметров реализован с помощью ссылок. Для обозначения ссылки в списке формальных параметров после указания типа соответствующего параметра используется знак &.
4.8.Библиотека стандартных функций
Ряд функций, которые часто используются во многих программах, образуют библиотеку стандартных функций языка С++, большинство из которых пришли из языка С.
Библиотека стандартных функций является частью практически любого компилятора языка C++ и позволяет программистам использовать готовые функции в своих программах. В состав библиотеки входят математические функции (вычисление логарифма, квадратного корня, возведение в произвольную степень и т.д.), функции ввода-вывода, функции обработки строк и символов и ряд других. Для работы со стандартными функциями необходимо включать в программу файлы заголовков, которые содержат объявления нужных стандартных функций.
Так, для выполнения математических стандартных функций нужно подключить к программе файл заголовков math.h:
#include <math.h>
. . .
double x=sqrt (a); // вычисление квадратного корня переменной a
. . .
5.Язык C++: стиль записи программ
При записи программ важно придерживаться определенного стиля записи. Прежде всего, стиль выражается в способе именования переменных и функций и в расположении операторов программы. Наличие правильного стиля облегчает изучение программ. Разбираться в программах, написанных в разных стилях, гораздо сложнее. Известно, что чтение программ с целью их проверки или модификации – не менее важное и редкое дело, чем их написание, и следует максимально облегчить это занятие.
В мировом программистском сообществе давно сложились представления о хорошем стиле программирования, и знание их свидетельствуют об уровне квалификации специалиста.
Итак, каждый оператор рекомендуется писать в отдельной строке. Допускается несколько коротких присваиваний в одной строке.
Пустые строки обычно разделяют однородные группы операторов. Например, можно поставить пустую строку между объявлением переменных и первым выполняемым оператором, перед группой логически связанных операторов.
При написании программ важно подчеркнуть структуру программы. Рекомендуемым средством достижения этой цели является отступ от левого края и расположение фигурных скобок. С левого края начинаются только описания функций, глобальных переменных и типов данных. Начало блока (открывающая фигурная скобка) увеличивает отступ следующего оператора от левого края на некоторое фиксированное число пробелов (обычно на табуляцию или на 3-4 пробела):
int
sum (int x, int y, int z)
{
return x + y + z; // запись с отступом
}
Как видно из примера, тип возвращаемого значения записан отдельной строкой, в следующей строке записано имя функции с формальными параметрами, с той же позиции в следующей строке – левая (открывающая) фигурная скобка. Тело функции, в данном случае состоящее из одного оператора, записано с отступом. Правая (закрывающая) фигурная скобка убирает отступ и записывается под именем функции.
Зависимость операторов друг от друга также подчеркивается отступом. Например, выполняемый оператор в операторе if зависит от условия, поэтому он записывается с отступом от позиции начала оператора if:
int
abs (int x)
{
if (x >= 0) // одинарный отступ
return x; // двойной отступ
else
return -x;
}
В операторах if-else без вложенности else располагается под соответствующим if.
Если в операторе if используется блок, то открывающаяся фигурная скобка ставится на той же строчке, где и условие, а закрывающаяся – на новой строчке в той же позиции,что и if. Если после этого следует конструкция else или else if, она начинается в той же строке через пробел:
if ( условие_1 ) {
операторы
} else if ( условие_2 ) {
операторы
} else {
операторы
}
Аналогичное правило используется для операторов цикла – тело цикла пишется с отступом по сравнению с заголовком цикла, закрывающаяся фигурная скобка убирает дополнительный отступ. Особенно важно придерживаться правил отступа при использовании вложенных циклов и условных операторов. Закрывающаяся фигурная скобка должна находиться на том же уровне, что и начало соответствующего условного оператора или цикла:
for (int i = 0; i < n; i++) {
if (x > 0) {
while (true) {
операторы
} // конец тела цикла while
} // конец тела if
} // конец тела цикла for
Немного отличается написание оператора switch. Несмотря на то, что после заголовка оператора ставится открывающаяся фигурная скобка, все метки case или default располагаются на том же уровне, что и switch. Однако операторы, соответствующие меткам, пишутся с отступом:
switch (code) {
case 1:
x = 1;
break;
case 2:
x = 2;
break;
default:
;
}
Те же цели – легкость понимания и удобства чтения – преследуют правила именования. Использование одно- или двух буквенных идентификаторов в качестве имен переменных допустимо только, если это временные локальные переменные, смысл которых и так ясен из контекста. Однобуквенные идентификаторы i, j, k, l также часто используют в качестве переменных цикла. Чаще всего имена функций, переменных и т.д. составляются из английских слов, описывающих их смысл. Имена функций целесообразно писать с маленькой буквы, также как и имена переменных. Имена констант целесообразно составлять из заглавных букв. Если имена констант состоят из нескольких слов, в качестве разделителя используется подчеркивание:
fact, width, length, BITS_IN_BYTE
6.Язык C++: встроенные типы данных
Большинство программ на языке C++ представляет и обрабатывает данные. Любые данные принадлежат к какому-то из типов. Тип данных определяет возможные значения данных и набор определенных для них операций. Например, данные типа short (“короткие” целые числа со знаком) могут принимать числовые значения от -32768 до 32767. Для данных этого типа определены обычные арифметические операции и правила выполнения этих операций при, например, переполнении, то есть при выходе результата за границы допустимых значений этого типа.
Данные могут быть постоянными, то есть неизменяемыми во время выполнения программы. Для обозначения таких данных используются константы. При работе с изменяемыми данными в программе создаются переменные для хранения изменяемых значений.
Встроенные типы данных предопределены в языке. Это основные, “базовые” типы, из которых составляют все производные типы. Различные реализации и различные компиляторы могут определять различные диапазоны значений целых и вещественных чисел.
В табл. 1 перечислены встроенные типы данных языка C++ и приведены наиболее типичные диапазоны их значений.
Таблица 1. Встроенные типы данных языка C++.
Название |
Обозначение |
Число байтов |
Диапазон значений |
Символ |
char |
1 |
от -128 до +127 |
Символ без знака |
unsigned char |
1 |
от 0 до 255 |
Короткое целое число |
short int |
2 |
от -32768 до +32767 |
Короткое целое число без знака |
unsigned short int |
2 |
от 0 до 65535 |
Длинное целое число |
long int |
4 |
от -2147483648 до +2147483647 |
Длинное целое число без знака |
unsigned long int |
4 |
от 0 до 4294967295 |
Вещественное число одинарной точности |
float |
4 |
от ±3.4е-38 до ±3.4е+38 (7 значащих цифр) |
Вещественное число двойной точности |
double |
8 |
от ±1.7е-308 до ±1.7е+308 (15 значащих цифр) |
Вещественное число увеличенной точности |
long double |
10 |
от ±1 .2е-4932 до. ±1 .2е+4932 |
Логическое значение |
bool |
1 |
значения true (истина) или false (ложь) |