154
{ Number znachenie;
/* соңғы болып znachenie.y элементі мән қабылдайды */
znachenie.x = 100;
znachenie.y = 50.;
cout << "znachenie.x: " << znachenie.x
<< " znachenie.y: " << znachenie.y << endl;
/* соңғы болып znachenie.х элементі мән қабылдайды */
znachenie.y = 50;
znachenie.x = 100;
cout << "znachenie.x: " << znachenie.x
<< " znachenie.y: " << znachenie.y << endl;
}
Программа нәтижесі:
znachenie.x: 1112014848 znachenie.у: 50
znachenie.x: 100 znachenie.y: 1.4013e-043
Программа орындалуы барысындағы мынадай мәліметтер
znachenie.x: 1112014848
znachenie.y: 50
соңғы элемент znachenie.у болғанын кӛрсетеді.
Ал программадағы мынадай мәліметтер
znachenie. x: 100 znachenie. у: 1.4013е-043
соңғы элемент znachenie.х болғанын кӛрсетеді.
Біріктірмелер келесі программада кӛрсетілгендей компьютер жадын ҥнемді
пайдалану мҥмкіндігін береді.
#include // С++ тілі стилінде
union many_types
{
char с; //
1
байт
int ivalue; //
4
байт
float fvalue; //
4
байт
double dvalue; //
8
байт
} my_union;
void main()
{
// дұрыс орындалатын енгізу-шығару операциялары
my_union.c = 'b';
cout << my_union.c << endl;
my_union.ivalue =1990;
cout << my_union.ivalue << endl;
my_union.fvalue = 19.90;
cout << my_union.fvalue << endl;
my_union.dvalue = 987654.32E+13;
cout << my_union.dvalue << endl;
// дұрыс орындалмайтын енгізу-шығару операциялары
155
cout << my_union.c << endl;
cout << my_union.ivalue << endl;
cout << my_union.fvalue << endl;
cout << my_union.dvalue << endl;
/* Программаның бірінші бөлігі дұрыс орындалды, өйткені
біріктірмеге әр түрлі типтегі мәліметтер бірден емес,
біртіндеп меншіктелді.
Ал екінші бөлікте тек double типті мән ғана дұрыс
көрсетілді, өйткені ол соңында енгізілген болатын. */
/*
біріктірменің
ең
көлемді
элементіне
тең
ұзындығын
есептеу
*/
cout << "Size of the union = "
<< sizeof (many_types) << " bytes" << endl;
}
Программаны орындау нәтижесі (
9.5-сурет):
b
1990
19.9
9.87654e+018
Ш
-154494568
-2.05461е+033
9.87б54е+018
Size of the union = 8 bytes
Press any key to continue
9.9 Биттік ӛрістер
Биттік ӛрістер – бҧл қҧрылым ӛрістерінің ерекше бір тҥрі. Олар мәліметтерді
жинақтап, мысалы, «иә/жоқ» сияқты жалаушаларды ықшамдап орналастыру
ҥшін қажет. Мҧндағы компьютер жадының ең кіші адрестелетін ҧяшығы – 1
байт, ал жалаушаны сақтау ҥшін бір-ақ бит жеткілікті. Биттік ӛрістерді
сипаттау кезінде оның атынан соң қос нҥкте қойылады да, ӛріс ҧзындығы
битпен (бҥтін оң константа) кӛрсетіледі:
struct Options{
bool centerX:1;
bool centerY:1;
unsigned int shadow:2;
unsigned int palette:4;
};
Биттік ӛрістер кез келген бҥтін типте бола береді. Ӛріс аты жазылмауы да
мҥмкін, мҧндай ӛрістер аппараттық шекараға туралау ҥшін қолданылады.
Ӛрісті пайдалану әдеттегідей оның атын кӛрсету арқылы орындалады. Ӛріс
адресін алуға болмайды, бірақ жалпы биттік ӛрістерді кәдімгі қҧрылым ӛрістері
сияқты пайдалана беруге болады. Жеке биттермен амалдар орындау байт пен
машиналық сӛздерге қарағанда, онша ҥнемді орындалмайды, ӛйткені ол ҥшін
компилятор арнайы кодтар жасап, программа кодының кӛлемін тым арттырып
жібереді. Биттік ӛрістертерді компьютер жадында орналастыру компиляторға
және аппаратураға байланысты болады.
9.5-сурет
156
Келесі қҧрылымды сипаттау мысалын қарастырайық:
struct BitCard {
/* көрсетілген цифрлар – бұл биттер саны */
unsigned face : 4; /* 0 – тҧз, ... ,12 – король; 4 бит 0 ... 15 сандарын сақтай
алады */
unsigned suit : 2; /* 0 – қиық, 1 – табан, 2 – шыбын, 3 – қарға; 2 бит 0 ... 3
сандарын сақтайды */
unsigned color : 1; /* 0 – қызыл, 1 – қара; мұнда 1 бит
жеткілікті */
} ;
Биттік ӛрістерді карта элементтерін сақтау ҥшін қолдану мысалы.
#include // С++ тілі стилінде
#include
#include
#include
struct BitCard {
unsigned face: 4; /* ағылш. face – карта;0 – туз,...,
12 – король */
unsigned suit: 2; /* ағылш. suit – карта түрі;0 – қиық,
1 – табан,2 – шыбын,3 – қарға */
unsigned color : 1; /* color – түсі; 0 – қызыл, 1 – қара */
};
void fillDeck(BitCard *); /*
deck
жиымын
52
картамен
толтыру
*/
void deal (BitCard *); /* deal – карта тарату;
экран 52 карта шығару */
void main ()
{
BitCard deck[52]; /* 52 картадан тұратын жиым */
fillDeck(deck) ;
deal(deck);
}
void fillDeck(BitCard *temp_deck)
{
for ( int i = 0; i < 52; i++)
{
temp_deck[i].face = i % 13;
temp_deck[i].suit = i / 13;
temp_deck[i].color = i / 26;
}
}
void deal (BitCard *temp_deck)
{ int l = 0; /* бөліп шығару үшін */
/* ықшамды болуы үшін карталарды екі бағанға бөлеміз:
Достарыңызбен бөлісу: |