МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


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

Передача массива структур в качестве аргумента функций.





Перечислимый тип данных. Приведите пример.

Перечисление – это конструируемый тип данных, во время описания которого задается имя типа данных и значения, которые могут принимать переменные этого типа.

Описание перечисляемого типа данных осуществляется оператором вида:

enum <имя_типа> {<список_значений>}<список_переменных>;

где <имя_типа> задается идентификатором Си по усмотрению программиста;<список_значений> задается в виде: <элемент1>, <элемент2>,...,<элементN>, где любой из элементов есть либо <имя>, либо <имя> = <константное_выражение>. В качестве <имя> используется идентификатор Си; <список_переменных> – это имена переменных типа перечисление, отделенные друг от друга запятой.

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

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

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

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

Этот способ описания пользуется именем типа перечисления, иногда называемым тегом (ярлыком) перечисления, которое ссылается на ранее описанный тип и использует его список перечисления, например:

enum day {saturday,sunday=0,monday, tuesday,wednesday,thursday, friday } workday; enum day nextday; enum day today=monday; //В С++ ключевое слово enum использовать необязательно: day vacancy;


В первом случае определяется тип перечисления day, объявляется переменная перечисления workday. Именованные константы получают следующие значения: saturday – 0 (по умолчанию), sanday – 0 (явно), остальные имена получают значения от 1 до 5.

Во втором случае объявлена переменная nextday типа enum day. Так как тип enum day был ранее объявлен, то достаточно лишь на него сослаться. В третьем случае объявлена переменная today типа enum day, и она инициализирована значением monday из списка значений. Можно объявлять и массивы перечисляемого типа, например:

enum day week[6];

В С++ есть возможность использовать неименованные перечисления,которая фактически является альтернативной формой определения символических констант. Например:

enum {FALSE, TRUE};

Побитовые операторы и операторы сдвига.

Таблица 4.3. Побитовые операторы

Символ операции Значение Использование
~ Побитовое НЕ ~expr
<< Сдвиг влево expr1<<expr2
>> Сдвиг вправо expr1>>expr2
& Побитовое И expr1 & expr2
^ Побитовое Исключающее ИЛИ expr1 ^ expr2
| Побитовое ИЛИ expr1 | expr2
&= Побитовое И с присваиванием expr1 &= expr2
^= Побитовое ИсклИЛИ с присваиванием expr1 ^= expr2
|= Побитовое ИЛИ с присваиванием expr1 |= expr2
<<= Сдвиг влево с присваиванием expr1 <<= expr2
>>= Сдвиг вправо с присваиванием expr1 >>= expr2

Побитовые операции рассматривают операнды как упорядоченные наборы битов, каждый бит может иметь одно из двух значений – 0 или 1. Такие операции позволяют программисту манипулировать значениями отдельных битов. Объект, содержащий набор битов, иногда называют битовым вектором. Он позволяет компактно хранить наборфлагов – переменных, принимающих значение “да” “нет”. Например, компиляторы зачастую помещают в битовые векторы спецификаторы типов, такие, как const и volatile. Библиотека iostream использует эти векторы для хранения состояния формата вывода.
Как мы видели, в С++ существуют два способа работы со строками: использование C-строк и объектов типа string стандартной библиотеки – и два подхода к массивам: массивы встроенного типа и объект vector. При работе с битовыми векторами также можно применять подход, заимствованный из С, – использовать для представления такого вектора объект встроенного целого типа, обычно unsigned int, или класс bitset стандартной библиотеки С++. Этот класс инкапсулирует семантику вектора, предоставляя операции для манипулирования отдельными битами. Кроме того, он позволяет ответить на вопросы типа: есть ли “взведенные” биты (со значением 1) в векторе? Сколько битов “взведено”?
В общем случае предпочтительнее пользоваться классом bitset, однако, понимание работы с битовыми векторами на уровне встроенных типов данных очень полезно. В этом разделе мы рассмотрим применение встроенных типов для представления битовых векторов, а в следующем – класс bitset.
При использовании встроенных типов для представления битовых векторов можно пользоваться как знаковыми, так и беззнаковыми целыми типами, но мы настоятельно советуем пользоваться беззнаковыми: поведение побитовых операторов со знаковыми типами может различаться в разных реализациях компиляторов.
Побитовое НЕ (~) меняет значение каждого бита операнда. Бит, установленный в 1, меняет значение на 0 и наоборот.
Операторы сдвига (<<, >>) сдвигают биты в левом операнде на указанное правым операндом количество позиций. “Выталкиваемые наружу” биты пропадают, освобождающиеся биты (справа для сдвига влево, слева для сдвига вправо) заполняются нулями. Однако нужно иметь в виду, что для сдвига вправо заполнение левых битов нулями гарантируется только для беззнакового операнда, для знакового в некоторых реализациях возможно заполнение значением знакового (самого левого) бита.
Побитовое И (&) применяет операцию И ко всем битам своих операндов. Каждый бит левого операнда сравнивается с битом правого, находящимся в той же позиции. Если оба бита равны 1, то бит в данной позиции получает значение 1, в любом другом случае – 0. (Побитовое И (&) не надо путать с логическим И (&&),но, к сожалению, каждый программист хоть раз в жизни совершал подобную ошибку.)
Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ (^) сравнивает биты операндов. Соответствующий бит результата равен 1, если операнды различны (один равен 0, а другой 1). Если же оба операнда равны, результата равен 0.
Побитовое ИЛИ (|) применяет операцию логического сложения к каждому биту операндов. Бит в позиции результата получает значение 1, если хотя бы один из соответствующих битов операндов равен 1, и 0, если биты обоих операндов равны 0. (Побитовое ИЛИ не нужно смешивать с логическим ИЛИ.)
Рассмотрим простой пример. Пусть у нас есть класс из 30 студентов. Каждую неделю преподаватель проводит зачет, результат которого – сдал/не сдал. Итоги можно представить в виде битового вектора. (Заметим, что нумерация битов начинается с нуля, первый бит на самом деле является вторым по счету. Однако для удобства мы не будем использовать нулевой бит; таким образом, студенту номер 1 соответствует бит номер 1.



Побитовые операторы сдвига являются оператором сдвига вправо (>>), который перемещает биты shift_expression вправо, и оператором сдвига влево (<<), перемещающим биты shift_expression влево. 1

shift-expression << additive-expressionshift-expression >> additive-expression

Оператор сдвига влево вызывает сдвиг битов shift-expression влево на количество позиций, определенных с помощью additive-expression.Позиции битов, освобожденные при операции сдвига, заполняются нулями.Сдвиг влево является логическим сдвигом (биты, сдвигаемые с конца отбрасываются, включая бит знака).Дополнительные сведения о типах побитовых сдвигов см. в статье Bitwise shifts (Побитовые сдвиги).

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

C++

#include <iostream>

#include <bitset>

using namespace std;

 

int main() {

unsigned short short1 = 4;

bitset<16> bitset1{short1}; // the bitset representation of 4

cout << bitset1 << endl; // 0000000000000100

 

unsigned short short2 = short1 << 1; // 4 left-shifted by 1 = 8

bitset<16> bitset2{short2};

cout << bitset2 << endl; // 0000000000001000

 

unsigned short short3 = short1 << 2; // 4 left-shifted by 2 = 16

bitset<16> bitset3{short3};

cout << bitset3 << endl; // 0000000000010000

}

Оператор сдвига вправо вызывает сдвиг группы битов shift-expression вправо на количество позиций, определенных с помощью additive-expression.Для чисел без знака позиции битов, освобожденные при операции сдвига, заполняются нулями.Для чисел со знаком бит знака используется для заполнения освобожденных позиций битов.Другими словами, если число является положительным, используется 0, если число является отрицательным, используется 1. В следующем примере показаны операции сдвига вправо с использованием чисел без знака.

C++

#include <iostream>

#include <bitset>

using namespace std;

 

int main() {

unsigned short short11 = 1024;

bitset<16> bitset11{short11};

cout << bitset11 << endl; // 0000010000000000

 

unsigned short short12 = short11 >> 1; // 512

bitset<16> bitset12{short12};

cout << bitset12 << endl; // 0000001000000000

 

unsigned short short13 = short11 >> 10; // 1

bitset<16> bitset13{short13};

cout << bitset13 << endl; // 0000000000000001

 

unsigned short short14 = short11 >> 11; // 0

bitset<16> bitset14{short14};

cout << bitset14 << endl; // 0000000000000000}

}





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.