|
Программирование >> Структурное программирование
Создание нового имени с помощью typedef не приводит к появлению нового типа данных; typedef просто создает новое имя уже описанного типа, которое затем может быть использовано в программе в качестве псевдонима существующего имени типа. С помощью typedef могут быть созданы синонимы и для встроенных типов данных. Например, в программе, в которой для представления целого числа требуется 4 байта, можно использовать в одной системе (на одних компьютерах) тип int, а в другой - тип long int, который соответствует целым с удвоенным объемом памяти. В программах, требующих обеспечить переносимость, можно использовать typedef для создания, например, псевдонима Integer для представления целых чисел, занимающих 4 байта. Тип Integer может быть псевдонимом типа int для систем с 4-х байтовыми целыми или псевдонимом типа long int в системах с 2-х байтовым представлением целых чисел, в которых значения типа long int занимают 4 байта. А затем при написании мобильной программы программист просто объявляет, что все целые переменные, занимающие 4 байта, имеют тип Integer. Замечание по мобильности 16.2 Использование typedef позволяет создавать более мобильные программы. 16.6. Пример: эффективное моделирование тасования и раздачи карт Программа, приведенная на рис. 16.2, основана на моделировании процессов тасования и раздачи карт, рассмотренных в главе 5, Указатели и строки . Программа представляет колоду карт как массив структур и использует высокоэффективные алгоритмы тасования и раздачи карт. Вывод результатов работы программы показан на рис. 16.3. В этой программе функция fillDeck инициализирует массив структур Card, в котором строки символов представляют карты каждой масти упоря-доченно от туза до короля. Массив структур Card передается функции shuffle, которая реализует быстродействующий алгоритм тасования. Функция shuffle принимает в качестве аргумента массив из 52 структур Card. Функция организует пикл по всем 52 картам (индексы массива принимают значения от О до 51). Для каждой карты случайным образом выбирается число от О до 51, определяющее карту, с которой данная карта будет меняться местами. Затем текущая структура Card и случайно выбранная структура Card меняются местами в массиве. Всего выполняется 52 перестановки за один проход массива, после чего массив структур Card оказывается полностью перетасованным. В этом алгоритме не может возникнуть неопределенная отсрочка, которая могла появляться в алгоритме тасования, приведенном в главе 5. Поскольку структуры Card менялись местами в массиве, то быстродействующий алгоритм раздачи карт, реализованный функцией deal, требует всего одного прохода массива для раздачи уже перетасованной колоды. Типичная ошибка программирования 16.5 Забывают включить индекс массива при ссылке на отдельные структуры в массиве структур. mam ( { Card deck[52]; char *face[ ] = { Туз , Двойка , Тройка , Четверка , Пятерка , Шестерка , Семерка , Восьмерка , Девятка , Десятка , Валет , Дама , Король }; char *suit[ ] = { черви , бубны , трефы , пики }; srand(time(NULL)); рандомизация fillDeck(deck, face, suit); shuffle(deck); deal(deck); return 0; 7oid fillDeck(Card *wDeck, char *wFace[ ], char *wSuit[ ]) Ф ( f- for (int i = 0; i < 52; i++) { \ wDeck[i].face = wFace[i % 13]; wDeck[i].suit = wSuit[i / 13]; I } void shuffle(Card *wDeck) for (int i = 0; i <= 51; i++) { int j = randO % 52; Card temp = wDeck[i]; wDeck[i] = wDeck[j]; wDeck[j] = temp; void deal(Card *wdeck) I < for (int i = 0; i < 52; i++) H cout setiosflags (ios::right) setw(5) wdeck[i].face масти setiosflags(ios::left) setw(8) M wdeck[i].suit ((i + 1) % 2 ? \t : \n ); } Рис. 16.2. Высокоэффективная программа моделирования тасования и раздачи карт Программа тасования и раздачи карт, использующая структуры #include <iostream.h> #include <iomanip.h> iV. tinclude <stdlib.h> tinclude <time.h> struct Card { Ц char *face; Л-Ь char *suit; ЩШ }; .... >ЯЙ fillDeck (Card *, char *[], char * [ ] ) ; mm void shuffle(Card *); -Щя void deal (Card *);
Рис. 16.3. Выходные данные быстродействующей программной модели тасования и раздачи карт 16.7 Поразрядные операции Язык С++ предоставляет программистам расширенные возможности для выполнения поразрядных операций, которые необходимы тем, кто хочет спуститься на уровень битов и байтов. Для разработки операционных систем, или программного обеспечения для тестирования аппаратных средств компьютеров, или программного обеспечения, поддерживаюш;его работу в сети, и для многих других видов программного обеспечения необходимо, чтобы программист взаимодействовал непосредственно с аппаратными средствами компьютеров. В этом и нескольких следующих разделах мы обсудим возможности языка С++, позволяющие выполнять поразрядные операции. Мы познакомимся со всеми поразрядными операциями и обсудим, каким образом можно сокращать затраты памяти, используя битовые поля. Все данные реализуются во внутреннем машинном представлении как последовательности битов. Каждый бит может принимать либо значение О, либо значение 1. В большинстве систем последовательность из 8 битов образует один байт, который является стандартной единицей для хранения переменной типа char. Другие типы данных хранятся в большем числе байтов. Поразрядные (побитовые) операции используются для манипуляций с битами целочисленных операндов (char, short, int и long, причем обоих видов: signed и unsigned). Но обычно поразрядные операции применяются к целым без знака (unsigned).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |