Задача этой книги дать краткое и четкое изложение языка С++ в соответствии со стандар том iso/iec 14882. Она предназначена для студентов, изучающих язык «с нуля»



Download 2 Mb.
bet219/232
Sana29.03.2022
Hajmi2 Mb.
#516205
TuriЗадача
1   ...   215   216   217   218   219   220   221   222   ...   232
Bog'liq
Т. А. Павловская C C . Программирование на языке высокого уровня

Вспомогательные классы


Êëaññ sliCe (ñðåç) ïîçâîëяåò çaäaòü ïîäìíîæåñòâî èíäåêñîâ ýëåìåíòîâ ìaññèâa:
Class sliCe{ publiC:
sliCe();
sliCe(size_t start, size_t size, size_t stride); size_t start() COnst; // èíäåêñ ïåðâîãî ýëåìåíòa size_t size() COnst; // ÷èñëî ýëåìåíòîâ
size_t stride() COnst; // øaã
};
Øaã — ýòî ðaññòîяíèå ìåæäó äâóìя ýëåìåíòaìè ñðåça. Íaïðèìåð, sliCe(3, 4, 2) çaäaåò ñðåç, ñîñòîяùèé èç ýëåìåíòîâ ìaññèâa ñ íîìåðaìè 3, 5, 7, 9, a sliCe(1, 3, 4) — ñ íîìåðaìè 1, 5, 9. Òaêèì îáðaçîì, ñ ïîìîùüþ ñðåçîâ ìîæíî ïðåäñòaâèòü ìaññèâ êaê ìaòðèöó, çaäaâ â íåì ñòðîêó èëè ñòîëáåö.
Òåïåðü ìîæíî ïðèâåñòè ïðèìåð îïåðaöèè èíäåêñaöèè ïîäìíîæåñòâ ìaññèâa valarray, îïèñaííîé â ïðåäûäóùåì ðaçäåëå: îïåðaòîð a[sliCe(1, 5, 3)] = b âûïîë- íèò ïðèñâaèâaíèå ìaññèâa b òîëüêî ýëåìåíòaì ìaññèâa a, çaäaííûì ñðåçîì.

Äëя óäîáíîé ðaáîòû ñ ïîäìíîæåñòâîì ýëåìåíòîâ ìaññèâa ââåäåí øaáëîí êëañña sliCe_array. Caìîñòîяòåëüíûå îáúåêòû ýòîãî êëañña íå ñîçäaþòñя, âñå îáðaùåíèя ê íèì ía ñaìîì äåëå ïåðåaäðåñóþòñя ía èñõîäíûé ìaññèâ:


sliCe_array& s1 = v2[sliCe(0, v.size() / 10, 10)];
// Óâåëè÷èòü ía 5 ïåðâûé ñòîëáåö ìaòðèöû 10 Õ 10:
s1 += 5;
sliCe_array& s2 = v2[sliCe(0, v.size() / 10, 1)];
// Óâåëè÷èòü â 2 ðaça êazäûé ýëåìåíò ïåðâîé ñòðîêè ìaòðèöû 10 Õ 10: s2 *= 2;
 øaáëîíå sliCe_array îïðåäåëåíû ñëîæíûå îïåðaöèè ïðèñâaèâaíèя (+=, *=, >=
è ò. ä.), íaïðèìåð:
vOid OperatOr*= (COnst valarray&) COnst; vOid OperatOr/= (COnst valarray&) COnst;
Îíè âûïîëíяþò óêaçaííûå äåéñòâèя ñ aðãóìåíòîì è ýëåìåíòaìè èñõîäíîãî ìañ- ñèâa, çaäaííûìè ñðåçîì, ía êîòîðûå ññûëaåòñя sliCe_array. Êðîìå òîãî, îïðåäåëå- ía îïåðaöèя ïðèñâaèâaíèя ñêaëяðíîãî çía÷åíèя, êîòîðaя âûïîëíяåò ïðèñâaèâa- íèå âñåì ýëåìåíòaì èñõîäíîãî ìaññèâa, âõîäяùèì â ñðåç.
Còaíäaðòíaя áèáëèîòåêa íå ïðåäîñòaâëяåò ñðåäñòâ äëя ðaáîòû ñ ìaòðèöaìè, íî ñ ïîìîùüþ aáñòðaêöèé, çaäaâaåìûõ ñðåçaìè, ìîæíî ýôôåêòèâíî ðaáîòaòü ñ ìaññè- âîì valarray êaê ñ ìaòðèöåé ïðîèçâîëüíîé ðaçìåðíîñòè.
Åñëè òðåáóåòñя ðaáîòaòü ñ ïîäìíîæåñòâîì, êîòîðîå íåëüçя çaäaòü îäíèì ñðåçîì, èñïîëüçóåòñя øaáëîí gsliCe — îáîáùåííûé ñðåç:
Class gsliCe{ publiC:
gsliCe();
gsliCe(size_t s, COnst valarray& len, COnst valarray& d);
size_t start() COnst; // èíäåêñ ïåðâîãî ýëåìåíòa valarray size() COnst; // ÷èñëî ýëåìåíòîâ â èçìåðåíèè
valarray stride() COnst; // øaãè äëя èíäåêña[0], èíäåêña[1],…
};
Îáîáùåííûé ñðåç çaäaåò íåñêîëüêî ñðåçîâ. Èíäåêñ ía÷aëüíîãî ýëåìåíòa óêa- çûâaåòñя ïåðâûì ïaðaìåòðîì s, ðaçìåðû ñðåçîâ ïåðåäaþòñя ÷åðåç ìaññèâ len, a øaãè — ÷åðåç ìaññèâ d. Ðaçìåðíîñòè ìaññèâîâ, îïðåäåëяþùèå êîëè÷åñòâî çaäa- âaåìûõ ñðåçîâ, äîëæíû ñîâïaäaòü.
Íaïðèìåð, åñëè çaäaòü ïaðaìåòðû
start = 0
len = {2, 3}
d = {4, 1}
ïîëó÷èì ïîñëåäîâaòåëüíîñòü èíäåêñîâ ìaññèâa
k = (0,1)  4 + (0,1,2)  1
êîòîðûå äaäóò â ðåçóëüòaòå ìaòðèöó 23 èç ëåâîãî âåðõíåãî óãëa ìaòðèöû 34, ðañïîëîæåííîé â ïaìяòè ïî ñòîëáöaì (ïåðâûé ñðåç ñ äëèíîé 2 è øaãîì 4 îïèñû-

âaåò äâa ýëåìåíòa ñòðîêè, âòîðîé — ñ äëèíîé 3 è øaãîì 1 — îïèñûâaåò òðè ýëå- ìåíòa ñòîëáöa):




Èñõîäíaя ìaòðèöa:

Îáîáùåííûé ñðåç:

00 01 02

00 01

10 11 12

10 11

20 21 22

20 21

30 31 32




Ðañïîëîæåíèå â ïaìяòè:




00 10 20 30 01 11 21 31 02 12 22 32




Òåïåðü, ÷òîáû, íaïðèìåð, îáíóëèòü ýëåìåíòû ïîäìaòðèöû 23, ìîæíî çaïèñaòü:
valarray v(1, 12); // Cîçäaåì ìaññèâ èç åäèíèö int length[] = {2, 3};
int str[] = {4, 1}; valarray len (length, 2); valarray d (str, 2);
// Îáíóëяåì ýëåìåíòû v[0], v[1], v[2], v[4], v[5], v[6]: v[gsliCe(0, len, d)] = 0;
Àíaëîãè÷íî øaáëîíó sliCe_array, äëя ðaáîòû ñ ïîäìíîæåñòâîì ýëåìåíòîâ ìaññè- âa, çaäaííûì îáîáùåííûì ñðåçîì, ââåäåí øaáëîí êëañña gsliCe_array, ñîäåðæa- ùèé òîò æå íaáîð ýëåìåíòîâ, ÷òî è sliCe_array. Caìîñòîяòåëüíûå îáúåêòû êëañña gsliCe_array ñîçäaâaòü çaïðåùåíî: âñå îáðaùåíèя ê íèì ïåðåaäðåñóþòñя ía èñ- õîäíûé ìaññèâ.
Åñëè òðåáóåòñя çaäaòü ïðîèçâîëüíîå ïîäìíîæåñòâî ýëåìåíòîâ ìaññèâa, äëя êîòî- ðîãî íåëüçя îïèñaòü çaêîí èçìåíåíèя èíäåêñîâ, èñïîëüçóþò ëîãè÷åñnèé ìaññèâ mask_array, êîòîðûé ïðåäñòaâëяåò ñîáîé valarray. Ýëåìåíò ýòîãî ìaññèâa, ðaâíûé true, îçía÷aåò, ÷òî ñîîòâåòñòâóþùèé ýëåìåíò valarray âêëþ÷aåòñя â ïîä- ìíîæåñòâî. Äëя mask_array îïðåäåëåí òîò æå íaáîð ïîëåé è ìåòîäîâ êëañña, ÷òî è äëя gsliCe_array.
Îáúåêòû ýòîãî êëañña ïîëó÷aþòñя â ðåçóëüòaòå èñïîëüçîâaíèя â îïåðaöèяõ îáîá- ùåííîé èíäåêñaöèè valarray, îïèñaííûõ â ïðåäûäóùåì ðaçäåëå, íaïðèìåð:
bOOl m[] = {true, true, false, true, false}; valarray mask (m, 5);
// Ýëåìåíòaì íîìåð 0,1è2 ìaññèâa v6 ïðèñâaèâaåòñя
// çía÷åíèå ñèíóña ñîîòâåòñòâóþùèõ ýëåìåíòîâ ìaññèâa v4,
// îïèñaííîãî â ïðåäûäóùåì ðaçäåëå:
valarray v6 = sin(v4[mask]);
Äðóãîé ñïîñîá âûäåëåíèя ïðîèçâîëüíîãî ïîäìíîæåñòâa, ïîçâîëяþùèé ïåðåóïî- ðяäî÷èâaòü ýëåìåíòû valarray, яâëяåòñя nîñâåííûé ìaññèâ indireCt_array.  íåì çaäaåòñя ïîñëåäîâaòåëüíîñòü èíäåêñîâ ìaññèâa. Îáúåêò ýòîãî êëañña ñîçäaåòñя ïðè èñïîëüçîâaíèè â êa÷åñòâå èíäåêña valarray, íaïðèìåð:
int i[] = {3, 2, 4, 0, 1};
valarray index(i, 5);

valarray v7 = v4[index];


// v7[0] = v4[3], v7[1] = v4[2], v7[2] = v4[4], v7[3] = v4[0], v7[4] = v4[1]
×èñëî ýëåìåíòîâ ìaññèâa, èñïîëüçóåìîãî â êa÷åñòâå èíäåêña, íå äîëæíî ïðåâû- øaòü ÷èñëî ýëåìåíòîâ â èíäåêñèðóåìîì ìaññèâå.
Ïåðå÷èñëåííûå êëaññû — sliCe_array, gsliCe_array, mask_array è indireCt_array — íåëü- çя ñîçäaâaòü âïðяìóþ è êîïèðîâaòü. Îíè ïðîçða÷íû äëя ïîëüçîâaòåëя è ñîçäaþò- ñя â ðåçóëüòaòå èñïîëüçîâaíèя â êa÷åñòâå èíäåêña ìaññèâa valarray ñðåçîâ, îáîá- ùåííûõ ñðåçîâ, ëîãè÷åñêèõ ìaññèâîâ valarray è ìaññèâîâ òèïa size_t ñîîòâåòñòâåííî.

ГЛАВА 16





Download 2 Mb.

Do'stlaringiz bilan baham:
1   ...   215   216   217   218   219   220   221   222   ...   232




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish