Программирование >>  Структурное программирование 

1 ... 286 287 288 [ 289 ] 290 291 292 ... 342


и-

fillDeck(deck) deal(deck); return 0;

void fillDeck(BitCard *wDeck)

for (int 1=0; i <= 51; i++ wDeck[i].face = i % 13; wDeck[i].suit = i / 13; wDeck[i].color = i / 26;

) {

Выходные данные для карт представлены в виде двух колонок. Карты 0-25 расположены в первой колонке с индексом kl. Карты 26-51 расположены во второй колонке с индексом к2. void deal(BitCard *wDeck) {

for (int kl =0, k2 = kl + 26; kl <= 25; kl++, k2++) {

cout << Карта: << setw(3) wDeck[kl] .face << Масть:

<< setw(2) wDeck[kl].suit wDeck[kl].color cout Карта: setw(3) wDeck[k2: setw(2) wDeck[k2].suit wDeck[k2].color endl;

Цвет: setw(2)

.face << Масть: Цвет setw(2)

Рис. 16.14. Использование битовых полей для хранения колоды карт (часть 2 из 2)

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Карта:

Масть:

Цвет:

Рис. 16.15. Выходные данные, полученные в результате выполнения программы, приведенной

на рис. 16.14



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

struct Example { unsigned а : 13; unsigned : 3; unsigned b : 4;

использует неименованное 3-х битовое поле как заполнение: ничто не может храниться в этих трех битах. Элемент b (в нашем компьютере машинное слово занимает 2 байта) хранится в другом элементе памяти.

Неименованное битовое поле нулевой ширины используется для выравнивания следуюш;его битового поля по границе нового элемента памяти. Например, описание структуры

struct Example { unsigned а : 13; unsigned : 0; unsigned b : 4;

использует неименованное поле нулевой ширины, чтобы пропустить оставшиеся биты (все, сколько их есть) в том элементе памяти, в котором хранится элемент а, и выровнять элемент b по границе следуюш;его элемента памяти.

Замечание по мобильности 16.5

Манипуляции с битовыми полями являются машинно-зависимыми. Например, в некоторых компьютерах битовые поля могут пересекать границы машинного слова, тогда как в других компьютерах это недопустимо.

Типичная ошибка программирования 16.9

Попытка осуществить доступ к отдельным битам битового поля как если бы они были элементами массива. Битовые поля не являются массивами битов .

Типичная ошибка программирования 16.10

Попытка получить адрес битового поля (операция & не может применяться к битовым полям, поскольку они не имеют адресов).

Совет по повышению эффективности 16.3

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

16.9. Библиотека обработки символов

Большинство данных вводится в компьютеры как символы, включая буквы, цифры и различные специальные символы. В этом разделе мы обсудим возможности языка C-t-I- по исследованию отдельных символов и манипули-



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

Библиотека обработки символов включает несколько функций, которые выполняют полезные операции по обработке символьных данных. Каждая из этих функций принимает символ типа int или EOF в качестве аргумента. Часто операции с символами выполняются как операции с целыми значениями. Вспомним, что EOF обычно имеет значение -1 и архитектура некоторых аппаратных средств не позволяет сохранять отрицательные значения в переменных типа char. Поэтому функции обработки символов манипулируют с символами как с целыми. На рис. 16.16 представлены функции библиотеки обработки символов. При применении функций из библиотеки обработки символов необходимо убедиться, что в программу включен заголовочный файл <ctype.h>.

Прототип

Описание функции

int isdigit(int с)

Возвращает true, если элемент с является цифрой, в противном случае возвращает false (0).

int isalpha (int с)

Возвращает true, если элемент с является буквой, в противном случае возвращает false (0).

int isalni (int c)

Возвращает true, если элемент с является цифрой или буквой, в противном случае возвращает false (0).

int isxdigit(int c)

Возвращает true, если элемент с является шеанадцатеричной цифрой, в противном случае возвращает false (0). (См. приложение Г Системы счисления для более детального изучения двоичных, восьмеричных, десятичных и шестнадцатеричных чисел).

int islower(int c)

Возвращает true, если элемент с является арочной буквой (в нижнем регистре), в противном случае возвращает false (0). Функция работает только для латинских букв.

int isupper(int c)

Возвращает true, если элемент с является прописной буквой (в верхнем региаре), в противном случае возвращает false (0). Функция работает только для латинских букв.

int tolower(int c)

Если элемент с является прописной буквой, то tolower возвращает элемент с как арочную букву. В противном случае tolower возвращает аргумент без изменения. Функция работает только для латинских букв.

int toupper(int c)

Если элемент с является арочной буквой, то toupper возвращает элемент с как прописную букву. В противном случае toupper возвращает аргумент без изменения. Функция работает только для латинских букв.

int isspace(int c)

Возвращает true, если элемент с является символом разделителем -символом перехода на новую строку (\п), пробелом (), символом перехода на новую араницу (\f), символом возврата каретки (\г), символом горизонтальной табуляции (\t) или символом вертикальной табуляции (\v). В противном случае возвращается false (0).

int iscntrl(int c)

Возвращает true, если элемент с является управляющим символом, в противном случае, возвращает false (0).

int ispunot(int c)

Возвращает true, если элемент с является символом пунктуации, отличным от пробела, цифры или буквы; в противном случае возвращает false (0).

int isprint(int c)

Возвращает true, если элемент с является любым печатным символом, включая пробел ( ); в противном случае возвращает false (0).

Jint isgraph (int c)

Возвращает true, если элемент с является печатным символом, отличным от пробела; в противном случае возвращает false (0).

Рис. 16.16. Краткое описание функций из библиотеки обработки символов



1 ... 286 287 288 [ 289 ] 290 291 292 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика