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

1 ... 282 283 284 [ 285 ] 286 287 288 ... 342


Создание нового имени с помощью 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 *);



1 :

Восьмерка

масти

бубны

масти

черви

Восьмерка

масти

трефы

Пятерка

масти

пики

Семерка

масти

черви

Двойка

масти

бубны

масти

трефы

Десятка

масти

бубны

Двойка

масти

пики

Шестерка

масти

бубны

Семерка

масти

пики

Двойка

масти

трефы

Валет

масти

треф

Десятка

масти

Король

масти

черви

Валет

масти

бубен

Тройка

масти

черви

Тройка

масти

бубен

Тройка

масти

треф

Девятка

масти

треф

Десятка

масти

черви

Двойка

масти

черви

Десятка

масти

треф

Семерка

масти

бубен

Шестерка

масти

треф

Дама

масти

Шестерка

масти

черви

Тройка

масти

Девятка

масти

бубен

масти

бубен

Валет

масти

Пятерка

масти

треф

Король

масти

бубен

Семерка

масти

треф

Девятка

масти

Четверка

масти

черви

Шестерка

масти

Восьмерка

масти

Дама

масти

бубен

Пятерка

масти

бубен

масти

Девятка

масти

черви

Король

масти

треф

Пятерка

масти

черви

Король

масти

Четверка

масти

бубен

Дама

масти

черви

Восьмерка

масти

черви

Четверка

масти

Валет

масти

черви

Четверка

масти

треф

Дама

масти

треф

Рис. 16.3. Выходные данные быстродействующей программной модели тасования и раздачи

карт

16.7 Поразрядные операции

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

Все данные реализуются во внутреннем машинном представлении как последовательности битов. Каждый бит может принимать либо значение О, либо значение 1. В большинстве систем последовательность из 8 битов образует один байт, который является стандартной единицей для хранения переменной типа char. Другие типы данных хранятся в большем числе байтов. Поразрядные (побитовые) операции используются для манипуляций с битами целочисленных операндов (char, short, int и long, причем обоих видов: signed и unsigned). Но обычно поразрядные операции применяются к целым без знака (unsigned).



1 ... 282 283 284 [ 285 ] 286 287 288 ... 342

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