Библиотека стандартных функций
Ряд функций, которые часто используются во многих программах, образуют библиотеку стандартных функций языка С++, большинство из которых пришли из языка С.
Библиотека стандартных функций является частью практически любого компилятора языка 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 | от -128 до +127 | |
Символ без знака | unsigned char | от 0 до 255 | |
Короткое целое число | short int | от -32768 до +32767 | |
Короткое целое число без знака | unsigned short int | от 0 до 65535 | |
Длинное целое число | long int | от -2147483648 до +2147483647 | |
Длинное целое число без знака | unsigned long int | от 0 до 4294967295 | |
Вещественное число одинарной точности | float | от ±3.4е-38 до ±3.4е+38 (7 значащих цифр) | |
Вещественное число двойной точности | double | от ±1.7е-308 до ±1.7е+308 (15 значащих цифр) | |
Вещественное число увеличенной точности | long double | от ±1 .2е-4932 до. ±1 .2е+4932 | |
Логическое значение | bool | значения true (истина) или false (ложь) |
Целые числа
Для представления целых чисел в языке C++ существует несколько типов, например, short int (”короткое” целое), int (целое) и long int (“длинное” целое). Они отличаются друг от друга диапазоном возможных значений (см. табл. 1). В словосочетаниях short int и long int описатель int можно опустить. Каждый из целочисленных типов может быть знаковым (signed) или беззнаковым (unsigned). По умолчанию, тип целых величин – знаковый. Если перед определением типа стоит ключевое слово unsigned, то тип целого числа беззнаковый. Так, для того, чтобы объявить переменную x как короткое целое знаковое число, нужно записать:
short x;
а чтобы указать, что оно короткое беззнаковое –
unsigned short x;
Переменная без знака может принимать только неотрицательные значения, переменная со знаком – как неотрицательные, так и отрицательные значения.
Тип int совпадает либо с short, либо с long. В современных аппаратно-операционных средах int можно принимать за полный аналог long, хотя некоторое время назад, в эпоху распространения 16-разрядной аппаратной базы, int совпадал с short.
Целое число может быть непосредственно записано в программе в виде константы. Запись чисел соответствует общепринятой нотации. Примеры целых констант: 0, 125, -37. По умолчанию целые константы принадлежат к типу int.
Кроме стандартной десятичной записи, числа можно записывать в восьмеричной или шестнадцатеричной системе счисления. Признаком восьмеричной системы счисления является цифра 0 в начале числа, признаком шестнадцатеричной – 0х или 0Х перед числом. Для записи шестнадцатеричных цифр используются большие или маленькие латинские буквы от А до F.
const int x = 240;
const int y = 0360;
const int z = 0xF0;
Отрицательные числа предваряются знаком “минус” (-).
Для целых чисел определены стандартные арифметические операции сложения (+), вычитания (-), умножения (*), деления (/), нахождение остатка от деления (%), изменение знака (-). Результатом этих операций также является целое число. При делении остаток отбрасывается.
Кроме стандартных арифметических операций, для целых чисел определен набор побитовых (или поразрядных) операций. В них целое число рассматривается как строка битов (нулей и единиц при записи числа в двоичной системе счисления или разрядов машинного представления числа).
К этим операциям относятся поразрядные (побитовые) операции И (&), ИЛИ (|), ИСКЛЮЧАЮЩЕЕ ИЛИ (^) и НЕ (отрицание) (~), а также поразрядные сдвиги. Поразрядные операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ выполняют операцию над соответствующими отдельными битами своих операндов, их результаты приведены в таблице 2.
Таблица 2. Результаты выполнения побитовых операций
p | q | p & q | p | q | p^q | ~p |
Операции сдвига, обозначаемые << и >>, сдвигают двоичное представление левого операнда в “указываемую” сторону на количество битов, соответствующее значению правого операнда.
При сдвиге влево число дополняется нулями справа. При сдвиге вправо значение, которым дополняется число, определяется тем, знаковое оно или беззнаковое. Беззнаковые числа при сдвиге вправо всегда дополняются нулями. Если же число знаковое, то для дополнения используется значение самого левого бита числа. Это объясняется тем, что во внутреннем представлении целых чисел в компьютере самый левый бит как раз и является знаком: 0 означает плюс, 1 означает минус.
Рассмотренные арифметические и поразрядные операции выполняются над целыми числами и в результате дают целое число. В отличие от них операции сравнения выполняются над целыми числами, но в результате дают логическое значение истина (true) или ложь (false).
Для целых чисел определены операции сравнения: равенства (= =), неравенства (!=), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=).
В языке C++ допустимо смешивать различные целые типы в выражении. Общее правило преобразования целых типов состоит в том, что более короткий тип при вычислениях преобразуется к более длинному. Только при выполнении присваивания более длинный тип может преобразовываться к более короткому. Такое преобразование не всегда безопасно, при нем могут потеряться значащие цифры. Обычно компиляторы выдают предупреждение или ошибку, встречая такое преобразование.
Вещественные числа
Вещественные числа в C++ могут быть одного из трех типов: с одинарной точностью (float), с двойной точностью (double) и с расширенной точностью (long double):
float x;
double e = 2.9;
long double s;
В большинстве реализаций языка представление и диапазоны значений соответствуют стандарту IEEE (Institute of Electrical and Electronics Engineers) для представления вещественных чисел. Именно в соответствии с этим стандартом в табл. 1 и приведены диапазоны значений вещественных чисел. Точность представления чисел составляет 7 десятичных значащих цифр для типа float, 15 значащих цифр для double и 19 для типа long double.
Вещественные числа записываются либо в виде десятичных дробей: 1.3, 3.1415, 0.0005, либо в виде мантиссы и экспоненты: 1.2Е-1, 0.12е0. Отметим, что обе предыдущие записи изображают одно и тоже число 0.12.
По умолчанию вещественная константа принадлежит к типу double.
Для вещественных чисел определены все стандартные арифметические операции: изменения знака (-), сложения (+), вычитания (-), умножения (*), деления (/) и изменения знака (-). В отличие от целых чисел, операция % не определена. Аналогично, все побитовые операции и сдвиги не применимы к вещественным числам; они работают только с целыми числами.
Вещественные числа можно сравнивать на равенство (= =), неравенство (!=), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=). В результате операции сравнения получается логическое значение истина или ложь.
Если арифметическая операция применяется к двум вещественным числам разных типов, то менее точное число преобразуется к более точному, то есть float преобразуется в double и double преобразуется к long double. Очевидно, что такое преобразование всегда можно выполнить без потери точности.
Если вторым операндом в операции с вещественным числом выступает целое число, то целое число преобразуется в вещественное представление.
Хотя любую целую величину можно представить в виде вещественного числа, при таком преобразовании возможна потеря точности (для больших чисел).
Дата добавления: 2015-11-10; просмотров: 1302;