Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Сейчас positive содержит -25536



сейчас big_positive содержит -294967296

сейчас little_positive содержит Т

 

Как видите, программа присваивает переменным типа int, long и char значения, которые находятся вне диапазона хранения каждого типа, поэтому возникает ошибка переполнения. При работе с переменными вам необходимо помнить диапазон значений, которые может хранить переменная каждого типа. Ошибки переполнения плохо уловимы, и поэтому их трудно определить и исправить. Обратите внимание на значение, которое программа выводит для переменной little_positive. Поскольку это переменная типа char, выходной поток cout пытается вывести ее значение в символьном виде. В этом случае выведенное значение соответствует второй половине таблицы ASCII со значением 210.

1.5.9. Представление о точности

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

Программа в примере 4.14 присваивает значение чуть меньше 0.5 переменным типа float и double. К сожалению, поскольку компьютер обладает ограниченной способностью в представлении чисел, переменные реально содержат не присваиваемые им значения, а число 0.5:

Пример 4.14

 

#include < iostream.h>

void main(void)

{
float f_not_half = 0.49999990;
double d_not_half = 0.49999990;
cout < < " Значение типа float 0.49999990 равно " < < f_not_half < < endl;
cout < < " Значение типа double 0.49999990 равно " < < d_not_half < < endl;
}

 

Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод:

Значение типа float 0.49999990 равно 0.5

Значение типа double 0.49999990 равно 0.5

 

Как видите, значения, присваиваемые программой переменным, и значения, которые переменные содержат в действительности, не идентичны. Такие ошибки округления происходят потому, что компьютер должен представлять числа, используя фиксированное количество единиц и нулей. В большинстве случаев компьютер может точно представлять числа. Однако иногда, как показано в этой программе, компьютер представляет числа приближенно, а не точно. При программировании вам необходимо всегда помнить о точности. В зависимости от значений, с которыми работают ваши программы, могут возникать трудно обнаруживаемые ошибки округления.

1.5.10. Следите за ошибками переполнения при арифметических операциях

Из раздела 1.7.7 вы узнали, что, если вы присваиваете переменной значение, которое не входит в диапазон значений для данного типа переменной, возникает ошибка переполнения. При выполнении арифметических операций необходимо помнить о возможности возникновения ошибок переполнения в процессе вычислений. Например, программа в примере 4.15 умножает 200 на 300 и присваивает результат переменной типа int. Однако, поскольку результат умножения (60000) превышает наибольшее возможное значение для типа int (32767), возникает ошибка переполнения.

Пример 4.15

#include < iostream.h>

void main(void)

{
int result;
result = 200 * 300;
cout < < " 200 * 300 = " < < result < < endl;
}

Когда вы откомпилируете и запустите эту программу, на экране появится следующий вывод:

200 * 300 = -5536

1.6. Константы

Константы , так же как и переменные, представляют собой область памяти для хранения данных с тем лишь отличием, что значение, присвоенное константе первоначально, не может быть изменено на протяжении выполнения всей программы. Констан­ты бывают литеральными и типизованными, причем литераль­ные константы делятся на: символьные, строковые, целые и ве­щественные.

Символьные константы представляются отдельным симво­лом, заключенным в одинарные кавычки (апострофы): 'е', '@', '< '

Строковые константы - это последовательность символов, заключенная в двойные кавычки: " Это пример не самой длинной строковой константы! 11.

Целые константы бывают следующих форматов:

■ десятичные;

■ восьмеричные:

■ шестнадцатеричные.

Десятичные могут быть представлены как последователь­ность цифр, начинающаяся не с нуля, например: 123; 2384.

Восьмеричные константы - последовательность восьмеричных цифр (от 0 до 7), начинающаяся с нуля, например: 034; 047.

Шестнадцатеричный формат констант начинается с симво­лов Ох или ОХ с последующими шестнадцатеричными цифрами (0…9.A…F), например: 0xF4; 0X5D. Буквенные символы при этом могут быть представлены в любом регистре.

Длинные целые константы, используемые в переменных типа long, определяются буквой 1 или L сразу после константы без пробела: 36L, 012L, 0x52L.

Вещественные константы - числа с плавающей запятой мо­гут быть записаны в десятичном формате (24.58; 13.0; .71) или в экспоненциальной форме (1е4; 5е+2; 2.2е-5, при этом в мантиссе может пропускаться целая или дробная часть: .2е4).

Типизованные константы используются как переменные, значение которых не может быть изменено после инициализации.

Типизованная константа объявляется с помощью ключевого слова const, за которым следует указание типа константы, но, в отличие от переменных, константы всегда должны быть инициализированы.

Символьные константы в С++ занимают в памяти 1 байт и, сле­довательно, могут принимать значения от 0 до 255 (см. табл. 4.2). При этом существует ряд символов, которые не отображаются при печати, - они выполняют специальные действия: возврат карет­ки, табуляция, и называются символами escape-последовательности. Термин мescape-последовательность" ввела компания Epson, ставшая первой фирмой, которая для управления выводом информации на своих принтерах стала использовать неотображаемые символы. Ис­торически сложилось так, что управляющие последовательности начинались с кода с десятичным значением 27 (0x1В), что соответ­ствовало символу " Escape" кодировки ASCII.

Escape-символы в программе изображаются в виде обратного слеша, за которым следует буква или символ.

Таблица 4.8.

Символы escape-последовательности

 

\\ Вывод на печать обратной черты
\' Вывод апострофа
\" Вывод при печати кавычки
\? Символ вопросительного знака
Подача звукового сигнала
\b Возврат курсора на 1 символ назад.
\f Перевод страницы
\n Перевод строки
Возврат курсора на начало текущей строки
\t Перевод курсора к следующей позиции табуляции
\v Вертикальная табуляция (вниз)

 

В качестве примера использования типизованных и литераль­ных констант вычислим значение площади круга по известному значению радиуса.

Пример 4.16.

#include < iostream.h>

int main ()

{

const double pi = 3.1415;

const int Radius = 3;

double Square =0;

Square = pi * Radius * Radius;

cout < < Square < < '\n';

return 0;

}

 

В начале главной функции программы объявляются две кон­станты: pi и Radius. Значение переменной Square изменяется в ходе выполнения программы и не может быть представлено как константа. Поскольку значение радиуса задано явно и в тексте программы не предусмотрено его изменение, переменная Ra­dius объявлена как константа.

 

1.7. Перечисления

При использовании большого количества логически взаимо­связанных констант удобно пользоваться перечислениями. Перечисления имеют вид:

enum Name {iteml[=def],

item2[=def],

... itemN[=def ] };

где

enum - ключевое слово (от enumerate - перечислять),

Name - имя списка констант,

iteml...itemN - перечень целочисленных констант,

[=def] - необязательный параметр инициализации.

 

Предположим, нам необходимо в программе описать рабо­ту светофора. Известно, что его цвет может принимать лишь 3 значения: красный (RED), желтый (YELLOW) и зеленый (GREEN). Для обработки полученных от светофора сигналов заведем три константы с такими же именами - RED, YELLOW и GREEN, проинициализировав их любыми неповторяющимися значениями с тем, чтобы в дальнейшем проверять, какой из этих трех цветов горит.

Например, мы могли бы записать.

Пример 4.17.

const int RED = 0;

const int YELLOW =1;

const int GREEN = 2;

 

Используя перечисления, то же самое можно сделать в одну строку:

enum COLOR {RED, YELLOW, GREEN};

 

Константы перечисления обладают следующей важной осо­бенностью: если значение константы не указано, оно на единицу больше значения предыдущей константы. По умолчанию первая константа имеет значение 0.

То же перечисление можно было проинициализировать дру­гими значениями:

enum COLOR {RED=13, YELLOW=l, GREEN};

При этом константа GREEN по-прежнему имеет значение 2.

 

1.8. Выражения

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

выражение;

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

Приведем примеры предложений языка:

х = 3 * (у + 2.48);

у = My_Func (dev, 9, i);

 

Выражение - это строка, составленная по определенным правилам из операндов, операций и предназначенная для получения значения. Например, 3+6/2*d.

 

Выражение называется константным, если его операндами являются только константы, например, 67-234.

 

По числу операндов, участвующих в операции, различают унарные (один операнд) и бинарные (два операнда) операции. Пример унарной операции -унарный минус (изменение знака числа); пример бинарной операции -*(умножение).

По типу выполняемой операции различают арифметические, сдвига, поразрядные логические, логические, операции отношения и др.

Из констант, переменных, разделителей и знаков операций можно конструировать выражения. Каждое выражение представляет собой правило вычисления нового значения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей. Если выражение формирует целое или вещественное число, то оно называется арифметическим. Пара арифметических выражений, объединенная операцией сравнения, называется отношением. Если отношение имеет ненулевое значение, то оно – истинно, иначе – ложно.

1.9. Правила записи выражений

Во избежание ошибок выражения в языке С++ должны записываться по определенным правилам. Приведем их.

1. Запись выражений ведется на одном уровне, в одну строчку, для
этого используется знак операции деления / (косая черта) и система
круглых скобок. Другими словами, многоэтажная система записи выражений, принятая в математике, при записи выражений в С++ недопустима. Например, математическое выражение должно быть записано как (x+y+z)/(a+b+c).

2. Не должно быть никаких надстрочных и подстрочных индексов. Это обеспечивается за счет соответствующего выбора идентификаторов. По-
этому, если требуется ввести в программу переменные, которые в обычной математической записи обозначаются, например, так:

то они могут быть идентифицированы в С++, следующим образом: hx, xn, y0, zmn, fstrich, x1.

3. В отличие от обычной математической записи, в которой многие знаки операций предполагаются по умолчанию, в выражениях языка C++ необходимо проставлять все знаки операций, в частности знак умноже­ния. Например, выражение (А + В) (X + У) бессмысленно: оно должно быть записано в виде (А + В)* (X + Y). Если вместо А*В написать АВ, то транслятор воспримет это выражение не как произведение переменных А и В, а как новую переменную (идентификатор) АВ, состоящую из двух символов.

4. Два символа операций не должны стоять рядом. Поэтому А*-В яв­ляется бессмысленным, но А*(-В) допустимо. Выражение вида X + 3*- 7+4 необходимо представить в виде X + 3*(-7) + 4.

Замечание: для операций инкремента и присваивания в С++ есть исключения из этого правила.

5. При записи выражений разрешается использовать только круглые
скобки. Поэтому, если в исходном математическом выражении имеются
квадратные или фигурные скобки, то их следует заменить на круглые.
Например, математическое выражение вида следует записать как

6. Количество круглых скобок при записи неограниченно, но необхо­димо следить, чтобы количество левых (открывающих) и правых (закры­вающих) круглых скобок было одинаковым.

7. Скобки используются для указания желаемой очередности выполне­ние операций так же, как и в обычной математической записи. Поэтому оба выра­жения А - В + С и А - (В + С) допустимы, но означают не одно и то же.

8. В сомнительных случаях порядок выполнения операций в выражениях следует доопределять с помощью скобок. Так, выражение должно
быть записано в виде А/(В* С), а не в виде А/В*С, соответствующем
выражению

9. Рекомендуется в выражениях по возможности не смешивать различные типы операндов, хотя это и допускается. Это связано с тем, что
при смешивании типов операндов происходит их преобразование к одному типу, а это ведет к замедлению выполнения программы, и в ряде случаев к потере точности и даже потере результата вообще.

10. Если выражение не помещается на одной строке бланка для записи программы, то его продолжают на следующих строках бланка, при
этом никаких дополнительных знаков переноса не ставится. Например,
такое простое выражение, как А + В; формально может быть записано на двух строках в виде

А + В;

либо в виде

А

+ В;

Из приведенных записей видно, что знак + ставится только один раз (в одной из строк), а не дважды, как это принято в математике.

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

Признаком конца выражения служит знак точка с запятой "; ".

11. При записи выражения в программе между идентификаторами, зна­ками операций и круглыми скобками разрешается ставить пробелы (хотя это обычно не делается). При изображении составных символов опера­ций (например, ||, & & , > > , < <, > =, < =, ==, ++, -- и др.) между их составными частями (символами) вставлять пробелы не разрешается.

12. Фактические параметры (аргументы) встроенных и других функций всегда должны быть заключены в круглые скобки.

13. Запятая, отделяющая целую и дробную части числа в математи­ке, при записи констант на языке С++ заменяется точкой.

 

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

Приведем примеры записи ряда арифметических выражений на языке С++:


 

  Математическая запись Запись на языке С++
ax3 + b a*x*x*x+b либо a*pow(x, 3)+b
x-3 pow(x, -3)
pow(z, 1/n)
sqrt(a)
  -8, 3·103 + a·n + 10-8   (-8.3e3+a*n+1e-8)/(exp(x)+d)
  ex + d  
  sin x2 + cos2 x   (sin(x*x)+cos(x)*cos(x))/fabs(tau)
  |t|  
             

 

1.10. Преобразования типов

В С++ существует явное и неявное преобразование типов.

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

Для явного преобразования переменной одного типа в другой перед именем переменной в скобках указывается присваиваемый ей новый тип:

Пример 4.18.

#include < iostream.h>

int main ()

{

int Integer = 54;

float Floating = 15.854;

Integer = (int) Floating; // явное преобразование

cout < < " New integer: ";

cout < < Integer < < ' \n';

return 0

}

 

В приведенном листинге после объявления соответствую­щих переменных (целочисленной integer и вещественной Floating) производится явное преобразование типа с плаваю­щей запятой (Floating) к целочисленному (Integer). Пример неявного преобразования:

Пример 4.19.

#include < iostream.h>

int main ()

{

int Integer = 0;

float Floating = 15.854;

Integer = Floating; // неявное преобразовани е

cout < < " New integer: ";

cout < < Integer < < '\n';

return 0;

}

 

В отличие от предыдущего варианта программы, в данном случае после объявления и инициализации переменных осущест­вляется присваивание значения переменной с плавающей запятой Floating целочисленной переменной Integer.

Результат работы обеих программ выглядит следующим образом:

New integer: 15

То есть произошло отсечение дробной части переменной Floating.

 

1.11. Операции (операторы) инкремента и декремента

1.11.1. Увеличение значения переменной на 1

Обычной операцией, которую вы будете выполнять при программировании, является прибавление 1 к значению целой переменной. Например, предположим, что ваша программа использует переменную с именем count, чтобы сохранить данные о количестве напечатанных файлов. Каждый раз, когда программа печатает файл, 1 будет добавляться к текущему значению count. Используя оператор присваивания C++, ваша программа может увеличивать значение count, как показано ниже:

count = count + 1;

В данном случае программа сначала выбирает значение count, а затем добавляет к нему единицу. Далее программа записывает результат сложения обратно в переменную count. Программа в примере 4.20 использует оператор присваивания для увеличения переменной count (которая первоначально содержит значение 1000) на единицу (присваивая переменной результат 1001):

Пример 4.20

#include < iostream.h>

void main(void)

{
int count = 1000;
cout < < " начальное значение count равно" < < count < < endl;
count = count + 1;
cout < < " конечное значение count равно" < < count < < endl;
}

Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод:


Поделиться:



Популярное:

  1. II. Другая группа коллизионных норм в области вещных прав содержится в ст. 1206 ГК РФ.
  2. Positive statement - negative tag - positive answer
  3. А что сейчас не тот террорист пошёл? Рожей не вышел? Гойская?
  4. Вода в атмосфере содержится в виде молекул пара, капелек и кристалликов.
  5. Ворен изменился. И сейчас Изобель придется столкнуться с новым врагом - тем, кто так же был ее самой большой любовью.
  6. Какое количество АТФ содержится в организме?
  7. МЕДИТАТИВНЫЕ СКАЗКИ, НА ОСОЗНАНИЕ СЕБЯ В НАСТОЯЩЕМ, «ЗДЕСЬ И СЕЙЧАС»
  8. Научитесь уважать бунтарей прямо сейчас. Теперь вам легче смотреть на них, как на взрослых? Не откладывайте признание в них равных партнёров по жизни.
  9. Отношение находится во второй нормальной форме (2НФ), если оно находится в 1НФ и не содержит неполных функциональных зависимостей.
  10. Предмет исследования - свойства, стороны, особенности объекта, которые подлежат непосредственному изучению. Предмет исследования обычно содержит в себе центральный вопрос проблемы.
  11. Раньше мы много говорили о дилемме сириусян, поэтому сейчас не будем вдаваться в дальнейшие детали.
  12. Режим Bilevel Positive Airway Pressure (BiPAP)


Последнее изменение этой страницы: 2016-05-03; Просмотров: 451; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.06 с.)
Главная | Случайная страница | Обратная связь