Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
17
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

1.7. Переменные и константы

При выполнении программы многие величины не изменяются. В качестве примера представим себе программу созданную для вычисления параметров окружности: длины, площади, площади секторов и т.п. В такой программе после ввода значения радиуса вычисляется некоторые параметры окружности, содержащие величину π, а результат выводится на печать. Для того, чтобы каждый раз в операторах не писать число 3.1415926, можно в самом начале программы присвоить этой величине имя PI и в дальнейшем им пользоваться. Однако не исключено, что спустя некоторое время программист забудет об этом и присвоет этому идентификатору новое значение. В результате появятся ошибки. Для того, чтобы исключить такую ситуацию в языке C++ имеется зарезервированное слово const, которое запрещает изменение значений переменных. То есть переменную модифицирует в константу, поэтому это слово называется модификатором.

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

У читателя может возникнуть вопрос: а чем лучше константа директивы #define, которая вместо величины PI подставляет в соответствующих местах ее значение? Ответ простой модификатор const обладает тем преимуществом, что обеспечивает контроль типов, что также бережет программиста от ошибок. Вот простой пример.

#include <iostream>

using namespace std;

const double PI=3.1416;

main()

{

cout<<"PI="<<pi<<endl;

}

Если в тело такой программы вставить оператор, который производит какие то действия с константой, например, осуществляет присваивание нового значения PI=3.1415926, то компилятор укажет на невозможность выполнения данного оператора. Дело обстоит хуже если ввести оператор cin>>PI; . В этом случае выводится сообщение о том, что оператор >> неприменим для переменной типа double. То есть ошибка программирования идентифицируется неверно. Для компиляторов С++ это весьма характерно. Очень часто они не могут точно описать найденную ошибку. Кстати говоря, даже в простых программах часто возникают ошибки, которые порой не очевидны. В самом деле, попробуйте убрать слово double из объявления константы. Программа будет работать, но константа будет восприниматься как целое, равное 3.

Вообще говоря, модификатор const не является таким уж всесильным. В программе константе нельзя присвоить новое значение, но можно ее переопределить и присвоить новую величину. Например, константу PI можно описать как обычную переменную. Вот пример сказанному.

#include <iostream>

using namespace std;

const double PI=3.1415926;

main()

{

cout<<"PI="<<PI<<endl;

double PI;

cin>>PI;

cout<<"PI="<<PI<<endl;

}

Вот пример переопределеня

Почему так происходит мы поймем когда будем говорить о локальных и глобальных переменных.

1.8 Логические операторы

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

Операторы сравнения.

При необходимости числа и переменные могут быть сравнены. Например, если рассматриваются две целые переменные n=3 и m=5, то результат n<m будет true, а результатом выражения n>m будет false. Операторы сравнения приведены в таблице.

Математический символ

Название

Обозначение

Пример

Значение результата

=

Равно

==

n==m

false

Не равно

!=

n!=m

true

<

Меньше

<

n<m

true

Меньше или равно

<=

n<=m

true

>

Больше

>

n>m

false

Больше или равно

>=

n>=m

false

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

Логическое И обозначается &&, т.е. двумя символами который называется амперсанд. Этот оператор аналогичен логической функции И. Чтобы пояснить как работает этот оператор рассмотрим таблицу значений двух величин x и y типа bool

x

y

x&&y

true

true

true

true

false

false

false

true

false

false

false

false

то есть результат равен true когда обе переменных равны true, в противном случае результат всегда равен false. Например, если использовать две переменные n=3 и m=5, то в результате их сравнения получим следующие результаты:

(n!=m)&&(n<=m)=true

(n!=m)&&(n>m)=false

(n!=m)&&(n<m)=true

Обратите внимание, на то, что сравниваемые выражения заключены в скобки. Это обстоятельство говорит о том, что в логических выражениях также можно применять круглые скобки. Но здесь это применено не столько для иллюстрации возможностей этих выражений сколько для удобочитаемости. На самом деле оператор && имеет более низкий приоритет, чем операторы сравнения, поэтому при отсутствии скобок результат не изменится. Правда в некоторых случаях язык С++ требует, чтобы все логическое выражение было заключено в круглые скобки, но об этом мы расскажем позднее. Сейчас перейдем к рассмотрению другого оператора.

Логическое ИЛИ. Обозначается двумя вертикальными линиями ||

Вновь продемонстрируем его на таблице

x

y

X||y

true

true

true

true

false

true

false

true

true

false

false

false

результат всегда будет true если хотя бы одна из переменных имеет значение true. Рассмотрим примет с теми же числами n=3 и m=5.

(n!=m)||(n<=m)=true

(n!=m)||(n>m)=true

(n!=m)||(n<m)=true

Логическое НЕ. Обозначается восклицательным знаком !

Этот оператор уже нам неоднократно встречался в примерах. При работе с числами его часто можно избежать путем применения знаков неравенств, но при использовании символьных или булевских переменных он бывает необходим. Например, пусть заданы две символьные переменные С1=”a” и С2=”b”. Выражение С1!=С2 имеет результат true.

С++ сохранил многие свойства языка С. В последнем булевских переменных true и false нет. Вместо false используется 0, а true это все что не ноль, то есть любые значения, например char. Поэтому будьте осторожны, не смотря на то, что ноль int и ноль double это разные значения, в логических выражениях они могут означать одно и тоже, т.е. false. При этом все правила написания логических выражений сохраняются. Различие в реализации булевских переменных часто приводит к дополнительным ошибкам.

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