Сделай Сам Свою Работу на 5

Скалярные типы и выражения





Министерство общего и профессионального образованиЯ

Российской Федерации

Курганский государственный университет

Кафедра методики преподавания информатики

МетодиЧеские рекомендации по изуЧению Языка ПРОГРАММИРОВАНИЯ СИ++

(для специальности 010100 - математика)

 

Курган 1999

Кафедра: “Методики преподавания информатики”

 

Дисциплина “Объектно-ориентированное программирование”

(специальность 010100),

 

 

Составитель: канд.пед.наук, доцент Медведев А.А.

 

Утверждены на заседании кафедры “18”ноября 1999 г.

 

Рекомендованы редакционно-издательским советом университета

“___” ______________________ г.

Общие сведения о программах, лексемах и алфавите

Алфавит языка программирования Си++ аналогичен алфавитам других языков программирования (Паскаль, Бейсик и т.д.). Из символов алфавита формируются лексемы языка (лексема – последовательность символов, обрабатываемая компилятором):

• идентификаторы;

• ключевые (служебные, зарезервированные) слова;

• константы;

• знаки операций;

• разделители (знаки пунктуации).

Идентификатор - последовательность из букв латинского алфа­вита, десятичных цифр и символов подчеркивания, начинающаяся не с цифры, например: RUN, Run, summa_factorial . Прописные и строчные буквы различаются. Таким образом, в этом примере два первых идентификатора различны. Длина разли­чаемой части идентификатора зависит от реализации языка Си++.



Ключевые (служебные) слова - это идентификаторы, зарезервиро­ванные в языке для специального использования. Не рекомендуется использовать символ подчеркивания в качестве начального символа при записи идентификаторов, так как такие конструкции активно применяются самим языком программирования.

Константа (литерал) - это лексема, представляющая изображе­ние фиксированного числового, строкового или символьного (литерного) значения. Константы бывают:

· целыми;

· вещественными (с пла­вающей точкой);

· перечислимыми;

· символьными (литерными);

· строковыми (строки или литерные строки).

Целые константымогут бытьдесятичными, восьмеричными и шестнадцатиричными. Десятичная целая константа определенакак последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль, например: 16, 484216, 0, 4. Диапазон допустимых це­лых положительных значений от 0 до 4 294 967 295. Константы, пре­вышающие указанное максимальное значение, вызывают ошибку на этапе компиляции. Отрицательные константы - это константы без знака, к которым применена операция изменения знака. Их абсолютные значения не должны превышать 2147483648.



Восьмеричные целые константы начинаются всегда с нуля, например 016 имеет десятичное значение 14.

Последовательность шестнадцатиричных цифр, которой предше­ствует 0x считается шестнадцатиричной константой. В шестнадцати­ричные цифры кроме десятичных входят латинские буквы от а (или а) до f (или f). Таким образом, 0х16 имеет десятичное значение 22, a 0xF - десятичное значение 15.

Таблица 1. Целые константы и выбираемые для них типы

Диапазоны значений констант Тип Данных
Десятичные Восьмеричные Шестнадцатиричные
от 0 до 32767 От 00 до 077777 от 0х0000 до 0х7FFF int
  от 0100000 до 0177777 от 0х8000 до 0xFFFF unsigned int
от 32768 до 2147483647 от 0200000 до 017777777777 от 0x10000 до 0x7FFFFFFF long
от 2147483648 до 4294967295 от 020000000000 до 037777777777 от 0x80000000 до 0xFFFFFFFF unsigned long

В зависимости от значения целой константы компилятор по-разному представляет её в памяти ЭВМ. Соответ­ствие между значениями целых констант и автоматически выбираемыми для них компилятором типами данных отображает таблица 1. Можно явно указать тип, используя суффиксы l,l (long) и U, u (unsigned). Например, константа 64L будет иметь тип long, хотя значению 64 должен быть приписан тип int, как это видно из таблицы 1. Для одной константы можно использовать два суффикса в произвольном порядке. Например, константы 0x22ul, 0x33Lu будут иметь тип unsigned long.



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

· целая часть (десятичная целая константа);

· десятичная точка;

· дробная часть (десятичная целая константа);

· признак (символ) экспоненты е или е;

· показатель десятичной степени (десятичная целая константа, возможно со знаком);

· суффикс F (или f) либо l (или 1).

В записях вещественных констант могут опускаться: целая или дробная часть (но не одновременно); десятичная точка или признак экспоненты с показателем степени (но не одновременно); суффикс. Примеры: 66. .0 .12 3.14159F 1.12e-2 2E+6L 2.71.

При отсутствии суффиксов вещественные константы имеют форму внутреннего представления, которой в языке Си++ со­ответствует тип данныхdouble. Добавив суффикс f или F, константе придают типfloat. Константа имеет типlong double, если в ее пред­ставлении используется суффикс l или 1. Диапазоны возможных зна­чений и длины внутреннего представления (размер в битах) данных вещественного типа показаны в таблице 2.

Перечислимые константы вводятся с помощью служебного сло­ваenum. Как правило, это целочисленные константы типа int, которым приписаны уникальные и удобные для использования обозначения. В качестве обозначений выбираются произвольные идентификаторы, не совпадающие со служебными словами и именами других объектов программы. Обозначения присваиваются константам с помощью определения, например: enum { one = 1, two = 2, three = 3 } ;. После такого определе­ния в программе вместо константы 2 (и наряду с ней) можно использовать ее обозначение two и т.д.

Таблица 2.Данные вещественного типа

Тип данных Размер, бит Диапазон значений
float от 3.4Е-38до 3.4Е+38
double от 1.7Е-308 до 1.7Е+308
long double от 3.4Е-4932 до 1.1Е+4932

Если в определении перечислимых констант опускать знаки "=" и не указывать числовых значений, то они будут приписываться иден­тификаторам (именам) по умолчанию. При этом самый левый в фи­гурных скобках идентификатор получит значение 0, а каждый последующий увеличивается на 1.

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

enum week { Sunday, Monday, Tuesday, Wednesday, Thursday Ffriday, Saturday };

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

Символьная (литерная) константа - это один символ, заключенный в апострофы. Для размещения их значений могут вводится пе­ременные символьного типа, то есть типаchar. Примеры констант: 'z', '*', '\0l2', '\0', '\n'. Последовательности литер, начинающиеся со знака '\', называют ESC-последовательностями. В таблице 3 приведены наиболее часто используемые последовательности.

Таблица 3. Часто используемые ESC-последовательности

Изображение Внутрен­ний код Реакция или смысл
0х07 Звуковой сигнал
\b 0х08 Возврат на шаг (забой)
\f 0х0С Новая страница
\n 0х0А Новая строка
0х0D Возврат каретки
\t 0х09 Табуляция горизонтальная
\v 0х0В Табуляция вертикальная
\\ 0х5С Обратная косая черта (\)
\’ 0х27 Апостроф (одинарная кавычка)
\" 0х22 Двойная кавычка (“)
\? 0х3F Вопросительный знак

Строка, или строковая константа, иногда называемая литерной строкой, определяется как последовательность символов, заключен­ная в кавычки.Среди символов строки могут быть ESC-последовательности, соответствующие не изобра­жаемым символьным константам или символам, задаваемым значе­ниями их внутренних кодов. В этом случае они также начинаются с обратной косой черты. Строки, записанные в программе подряд или через пробельные разделители, при компиляции конкатенируются (склеиваются). Таким образом, в тексте программы последовательность из двух строк:

"Строка - это массив символов. " "Строка имеет тип char[]."

эквивалентна одной строке:

"Строка - это массив символов. Строка имеет тип char[]."

Размещая строку в памяти, транслятор автоматически добавляет в ее конец символ ‘\0’, то есть нулевой байт. Таким образом, количество символов во внутреннем представлении строки на 1 больше числа символов в ее записи. Пустая строка хранится как один символ "\0". Кавычки не входят в строку, а служат ее ограничителями при за­писи в программе. В строке может быть один символ, например, "а" - строка из одного символа. Однако в отличие от символьной констан­ты 'а' длина внутреннего представления строки "а" равна 2. Строка может быть пустой "", при этом ее длина равна 1. Однако символьная константа не может быть пустой, то есть запись ' ' в большинстве реали­заций недопустима.

 

Знаки операций

Все возможные операции делятся на две группы по числу используемых операндов: унарные и бинарные. Таблицы 4 и 5 содержат список операций.

 

Таблица 4. Унарные операции

Обозначение операции Назначение операции
& Получение адреса операнда.
* Обращение по адресу, то есть доступ по адресу к значению того объекта, на который указывает операнд. Операндом должен быть адрес.
- Унарный минус - изменяет знак арифметического операнда.
+ Унарный плюс (введен для симметрии с унарным минусом).
~ Поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента (побитовое отрицание).

 

Продолжение таблицы 4.

! Логическое отрицание (логическое НЕ) значения операнда. Может применяться к скалярным операндам. Результат операции равен 0, если операнд ненулевой и 1 в противном случае. В качестве логических значений в языке Си++ используют целые числа: 0 - ложь, !0 (не нуль) - ис­тина. Отрицанием любого ненулевого числа будет 0, а от­рицанием нуля будет 1. Таким образом: !1 равно 0; ! (-5) равно 0; !0 равно 1.
++ Увеличение на единицу (инкремент). Операция может быть префиксной (увеличение значения операнда на 1 до его использования) и постфиксной (увеличение значения операнда на 1 после его использования).
-- Уменьшение на единицу (декремент).
sizeof Вычисление размера (в байтах) объекта того типа, который имеет операнд. Используются два формата опе­рации: sizeof (унарное_выражение) и sizeof (тип).

Бинарные операции. Эти операции делятся на следующие группы: аддитивные, мультипликативные, сдвигов, поразрядные, операции отношений, логические, присваивания, выбора компонента структурированного объекта, операции с компонентами классов, операция "запятая", скобки в качестве операций.

Таблица 5. Бинарные операции

Обозначение операции Назначение операции
Аддитивные операции
+ Бинарный плюс (сложение арифметических операндов или сложение указателя с целочисленным операндом).
- Бинарный минус (вычитание арифметических операндов или указателей).
Мультипликативные операции
* Умножение операндов арифметического типа.
/ Деление операндов арифметического типа. При целочисленных операндах абсолютное значе­ние результата округляется до целого. Например: 20/3 равно 6, -20/3 равняется -6, (-20)/3 равно -6, 20/(-3) равно –6.
% Получение остатка от деления целочисленных операндов (деление по модулю). При неотрицательных операндах остаток положительный. В противном случае остаток опре­деляется реализацией. Например: l3%4 равняется 1, (-13) %4 равняется -1, 13%(-4) равно +1, а (-13)% (-4) равняется -1. При ненулевом делителе для целочисленных операндов всегда выполняется соотношение: (a/b) *b + a%b равно а.

 

Продолжение таблицы 5.

Операции сдвига (определены только для целочисленных операндов). Формат выражения с операцией сдвига:<операнд1> <операция сдвига> <операнд2>.
<< Сдвиг влево битового представления операнда1 на количество разрядов, равное зна­чению операнда2.
>> Сдвиг вправо битового представления операнда1 на количество разрядов, равное значению операнда2.
Поразрядные операции
& Поразрядная конъюнкция (И) битовых представлений зна­чений целочисленных операндов.
| Поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов.
^ Поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов.
Операции отношения (сравнения). Тип операндов: арифметический или указатель. Результат целочисленный: 0 (ложь), 1(истина).
< Меньше, чем.
<= Меньше или равно.
>= Больше или равно.
== Равно.
!= Не равно.
Логические бинарные операции Результат: 0 (ложь) или 1 (истина).
&& Конъюнкция арифметических операндов или отношений.
|| Дизъюнкция арифметических операндов или отношений.
Операции присваивания
= Присвоить значение выражения-операнда из правой части операнду левой части, например: Р = 10.3 - 2*х;.
*= Присвоить операнду левой части произведение значений обоих операндов: например: P*= 2 эквивалентно Р = Р * 2;.
/= Присвоить операнду левой части частное от деления значе­ния левого операнда на значение правого, например: P/=2.2-d эквивалентно Р = Р / (2.2 – d);.
%= Присвоить операнду левой части остаток от деления цело­численного значения левого операнда на целочисленное значение правого операнда, например: n %= 3 эквивалентно N = n % 3;.
+= Присвоить операнду левой части сумму значений обоих операндов, например: A+=B эквивалентно A = A+B;.

 

 

Продолжение таблицы 5.

-= Присвоить операнду левой части разность значений левого и правого операндов, например: X-=4.3-z эквивалентноX = X-(4.3-Z);.
<<= Присвоить целочисленному операнду левой части значение, полученное сдвигом влево его битового представления на количество разрядов, равное значению правого целочисленного операнда: a<<=4 эквивалентно a = a<<4.
>>= Присвоить целочисленному операнду левой части значение, полученное сдвигом вправо его битового представления на количество разрядов, равное значению правого целочис­ленного операнда: а >>= 4 эквивалентно a = a>>4.
&= Присвоить целочисленному операнду левой части значение, полученное поразрядной конъюнкцией (И) его битового представления с битовым представлением целочисленного операнда правой части: a &= 44 эквивалентно a = a & 44.
!= Присвоить целочисленному операнду левой части значение, полученное поразрядной дизъюнкцией (ИЛИ) его битового представления с битовым представлением целочисленного операнда правой части: a != b эквивалентно a = a!b.
^= Присвоить целочисленному операнду левой части значение, полученное применением поразрядной операции исклю­чающего ИЛИ к битовым представлениям значений обоих операндов: z ^= х + у эквивалентно z = z ^ (х + у).
Операторы выбора компонентов структурированного объекта
.(точка) Прямой выбор (выделение) компонента структурированного объекта, например объединения. Формат опе­рации: имя структурированного объекта.имя компонента
-> Косвенный выбор (выделение) компонента структурированного объекта, адресуемого указателем. При использовании операции требуется, чтобы с объектом был связан указатель. Формат опе­рации: имя структурированного объекта->имя компонента
Операции с компонентами классов
.* Прямое обращение к компоненту класса по имени объекта и указателю на компонент.
->* Косвенное обращение к компоненту класса через указатель на объект и указатель на компонент.

 

 

Продолжение таблицы 5.

:: Операция указания области видимости. Имеет две формы: бинарную и унарную. Бинарная форма применяется для до­ступа к компоненту класса. Унарная операция позво­ляет получить доступ к внешней для некоторой функции именованной области памяти.
Запятая в качестве операции
, Несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения.
Скобки в качестве операций
( ) и [ ] Играют роль бинарных операций при вызове функций и индексировании элементов массивов.

В заключение перечислим еще несколько операций, которые можно использовать при составлении программ.

Условная операция используется с тремя операндами. Общий вид:

<выражение1>?<выражение2> : <выражение3> .

Первым вычисляется значение выражения1. Если оно истинно, то есть не равно нулю, то вычисляется значение выражения2, которое становится результатом. Если при вычислении выражения1 получит­ся 0, то в качестве результата берется значение выражения3. Например: при выполнении присваивания: g = x < 0 ? -х : x; переменная g в качестве своего значения будет иметь абсолютное значение переменной х.

Операция явного преобразования (приведения) типа. Имеет две различные формы:

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

(long) l - внутреннее представление имеет длину 4 байта;

(char) l - внутреннее представление имеет длину 1 байт;

· имя типа(операнд).Функциональная форма преобразования типа используется в тех случаях, когда тип имеет про­стое (несоставное) наименование (обозначение), например:

long (2) - внутреннее представление имеет длину 4 байта;

double (2) - внутреннее представление имеет длину 8 байтов.

Однако будет недопустимым выражение: unsigned long(2).

Операции new и delete.Используются для динамического распределения памяти. Операции

<указатель> = new <имя типа> либо

<указатель> = new <имя типа>( <инициализатор>)

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

Здесь необязательный инициализатор - это выражение в круглых скобках, значением которого заполняется выделенная область памяти. Указатель, которому присваивается получаемое значение адреса, должен относиться к тому же типу данных, что и имя_типа в операцииnew. Примеры:

· операция new float выделяет участок памяти размером 4 байта;

· операция new int(l5) выделяет участок памяти в 2 байта и инициа­лизирует этот участок целым значением 15.

Определение указателя имеет вид: тип *<имя указателя>; .Имя указателя - это идентификатор. Таким образом, int *h; - определение указателя h, который может быть связан с участком памяти, выделенным для ве­личины целого типа. Введя с помощью определения указатель, можно присвоить ему возвращаемое операциейnew значение:

h = new int(15);.

В дальнейшем доступ к выделенному участку памяти обеспечивает выражение *h.

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

Продолжительность существования выделенного с помощью операции new участка памяти - от точки создания до конца программы или до явного его освобождения.

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

delete <указатель>; , где

указатель адресует освобождаемый участок памяти, ранее выделенный с помощью операции new. Например: delete h; освободит участок па­мяти, связанный с указателем h. Повторное применение операции delete к тому же указателю дает неопределенный результат.

Для освобождения памяти, выделенной для массива, используется следующая модификация того же оператора: delete[ ] <указатель>;, где указатель связан с выделенным для массива участком памяти.

Приведем таблицу приоритетов, или рангов операций, позволяющую определить последовательность выполнения операций.

 

Таблица 6. Приоритеты операций

Ранг Операции
( ) [ ] -> :: .
! ~ + - ++ -- & * (тип) sizeof new delete тип( )
.* ->*
* / % (мультипликативные бинарные операции)
- + (аддитивные бинарные операции)
<< >>
< <= >= >
== !=
&
^
|
&&
||
?: (условная операция)
= *= /= %= += -= &= ^= != <<= >>=
, (операция “запятая”)

 

 

Скалярные типы и выражения

 

Для определения и описания переменных основных типов используются следующие ключевые слова, каждое из которых в отдель­ности может выступать в качестве имени типа:

• char (символьный);

• short (короткий целый);

• int (целый);

• long (длинный целый);

• float (вещественный);

• double (вещественный с удвоенной точностью);

• void (отсутствие значения).

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

char newsimbol = '\n' ;

long filebegin = 0L;

double pi = 3.1415926535897932385;

В обозначении типа может использоваться одновременно несколько служебных слов. Например, определение: long double zebra, stop.; вводит переменные с именами zebra и stop вещественного типа удвоенной точности, но явно не присваивает этим переменным ника­ких начальных значений.

Употребляемые как отдельно, так и вместе с другими именами ти­пов служебные словаunsigned (беззнаковый) иsigned (знаковый) позволяют для арифметического или символьного типа выбирать способ учета знакового разряда:

unsigned int i, j, k; // Значения от 0 до 65535

unsigned long L, M ,N; // Значения от 0 до 4294967295

unsigned char с, s; // Значения от 0 до 255

При таком определении переменные i, j, k могут принимать только целые положительные значения в диапазоне от 0 до 65535 и т.д.

Применение в определениях типов отдельных служебных словint, char, short, long эквивалентноsigned int, signed char, signed short, signed long. Именно поэтому служебное словоsigned обычно опускается в определениях и описаниях. Использование при задании типа толькоunsigned эквивалентноunsigned int.

Основные типы данных представлены в таблице 7.

Таблица 7. Основные типы данных

Тип данных Размер, бит Диапазон значений Назначение типа
unsigned char 0...255 Небольшие целые числа и коды символов.
char -128...127 Очень малые целые числа и ASCII-коды.
enum -32768...32767 Упорядоченные наборы целых значений.
unsigned int 0...65535 Большие целые и счетчики циклов.
short int -32768...32767 Небольшие целые, управление циклами.
int -32768...32767 Небольшие целые, управление циклами.
unsigned long 0...4294967295 Астрономические расстояния.
long -2147483648... ...2147483647 Большие числа, популяции.
float 3.4Е-38...3.4Е+38 Научные расчеты (7 значащих цифр).

 

Продолжение таблицы 7.

Double 1.7Е-308...1.7Е+308 Научные расчеты (15 значащих цифр).
long double 3.4Е-4932... ...1.1Е+4932 Финансовые расчеты (19 значащих цифр).

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

· auto (автоматически выделяемая, локальная память) – используется при определении объектов блока (функции). При входе в блок объекту (переменной) выделяется память, которая освобождается при выходе из блока. По умолчанию всем переменным присваивается этот спецификатор;

· register (автоматически выделяемая, по возможности регистровая память) – аналогичен auto, но для размещения объектов используются регистры, а не участки основной памяти. В случае отсутствия регистровой памяти компилятор обрабатывает такие объекты как объекты автоматической памяти;

· static (внутренний тип компоновки и статическая продолжительность существования) –объект с таким спецификатором будет существовать в пределах того файла с исходным текстом программы или модуля, где он определен. Класс памятиstatic может приписываться переменным и функциям;

· extern (внешний тип компоновки и статическая продолжительность существования) - объект этого классаглобален, то есть доступен во всех модулях (файлах) программы. Классextern может быть приписан переменной или функции.

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

Продолжительность существования объектов (в частности, переменных) – это период, в течение которого идентификаторам в программе соответствуют некоторые значения. Определены три вида продолжительности: статическая, локальная и динамическая.

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

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

Объекты с динамической продолжительностью существования создаются и уничтожаются с помощью явных операторов в процессе выполнения программы. Для создания используется операция new и функция malloc(), а для уничтожения - операция delete или функция free().

 

 

2. Основные операторы языка программирования Си++

Каждый оператор языка Си++ заканчивается символом "точка с запятой". Любое выражение, после которого поставлен этот символ, воспринимается компилятором как отдельный оператор. Частным случаем оператора служит пустой оператор. Он представляется символом "точка с запятой", перед которым нет никакого выражения или не завершенного разделителем оператора. Пустой оператор не предусматривает выполнения каких-либо действий. Он используется там, где синтаксис языка требует присутствия оператора, а по смыслу программы никакие действия не должны выполняться. Этот оператор чаще всего используется в качестве тела цикла, когда все циклически выполняемые действия определены в его заголовке: например:

//Вычисление факториала 4!

for (int i=0,p=1; i<4; i++,p*=i) ;

Перед каждым оператором может быть помещена метка, отделяемая от оператора двоеточием. В качестве метки используется произвольный уникальный идентификатор. Область действия меток – это сфера действия функции.

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

 

Условные конструкции

 

К таким конструкциям относятся: условный оператор (if … else) и переключатель (оператор варианта) (switch).

1. Общий вид условного оператора:

if (<выражение>) <оператор1>; else <оператор2>;

а также его сокращенная форма:

if (<выражение>) <оператор>; .

Примеры: if (х > 0) {x = -x; a =2*b;} //Полная условная конструкция

else { int i = 2; x *=i; a=b/x;}

if (a<0) a=-a; //Сокращенная условная конструкция

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

if (j>0) {int i; i=2*j;} else i=-j;

так как переменная i локализована в блоке и не существует вне его.

2. Общий вид переключателя следующий:

switch (<переключающее выражение>)

{ case <константное_выражение_1>: <операторы_1>;

case <константное_выражение_2>: <операторы_2>;

. . . . . .

case <константное_выражение_n>: <операторы_n>;

default: <операторы>;

}

Управляющая конструкция switch передает управление к тому из помеченных с помощью case операторов, для которого значение кон­стантного выражения совпадает со значением переключающего вы­ражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значения константных выра­жений, помещаемых за служебными словами case, приводятся к типу переключающего выражения. В одном переключателе все констант­ные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенных в фигурных скобках после конструкции switch (...), может быть помечен одной или несколь­кими метками case. Если значение переключающего выражения не совпадает ни с од­ним из константных выражений, то выполняется переход к оператору, отмеченному меткой default. В каждом переключателе должно быть не больше одной меткиdefault, однако эта метка может и отсутство­вать. В этом случае при несовпадении переклю­чающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.

Метки не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление.

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

#include<iostream.h>

void main()

{ int ic;

cout << ”\nВведите любую десятичную цифру: ”;

cin > ic;

cout << ‘\n’;

switch (ic)

{ case 0: case 1: cout << “один, ”;

case 2: case 3: cout << “три, ”;

case 4: case 5: cout << “пять, ”;

case 6: case 7: cout << “семь, ”;

case 8: case 9: cout << “девять ”;

break; //Выход из переключателя

default: cout << “Ошибка! Это не цифра! ”

}

}

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

Операторы цикла

 

Существуют три конструкции цикла:

· цикл с неизвестным числом повторений.Его общий вид:

while (<условие или выражение>)

<тело цикла>;

При входе в цикл проверяется условие или вычисляется выражение. Если его значение отлично от нуля, то выполняется тело цикла. Процесс продолжается, пока значение конструкции, стоящей после служебного слова while не станет равным 0.

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

#include <iostream.h>

void main()

{

char *stroka; //Указатель на массив

int len=0; //

stroka = new char [80]; //Выделение места

//в памяти для размещения массива

cout << "\nЗадайте строку: ";

cin >> stroka; //Ввод строки

cout << '\n';

while (*stroka++) len++; //Поиск нулевого символа

cout << "\nДлина строки: " << len << '\n';

delete [] stroka; //Уничтожение массива

}

Здесь выход из цикла - равенство нулю того элемента строки, который адресуется указателемstroka. Порядок вычисления выражения, стоящего после служебного слова while, будет следующим: сначала будет выбрано значе­ние указателяstroka, затем оно будет использовано для доступа по адресу, выбранное значение будет значением выражения в скобках и затем значение указателя будет увеличено на 1.

Часто после служебного слова while располагается проверяемое условие. Пример: составить программу, вычисляющую сумму квадратов первых k натуральных чисел.

#include <iostream.h>

void main()

{

int s=0,i=0,k;

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.