Qarshi filiali kompyuter injiniringi fakulteti axborot xavfsizligi yo’nalishi i-bosqich ax-11-22 guruh talabasi


Complex, valarray, slice, gslice sonli sinflar


Download 417.45 Kb.
bet5/13
Sana03.11.2023
Hajmi417.45 Kb.
#1744283
1   2   3   4   5   6   7   8   9   ...   13
Bog'liq
3-mustaqil ish. DASTURLASH

2.Complex, valarray, slice, gslice sonli sinflar

Kompleks sonlar sinf complex standart kutubxonaning yana bir sinfidir. Odatdagidek, siz foydalanish uchun sarlavha faylini kiritishingiz kerak:


#include complex
Kompleks son ikki qismdan iborat - haqiqiy va mavhum. Mavhum qism manfiy sonning kvadrat ildizidir. Kompleks son odatda quyidagicha yoziladi
2 + 3i
Bu yerda 2 – haqiqiy qism, 3i esa mavhum. Complex tipida obyektlarni aniqlash quyida keltirilgan:

// sof mavhum raqam: 0 + 7-i


complex double purei( 0, 7 );
// mavhum qism nolga teng: 3 + Oi
complex float rea1_num( 3 );
// haqiqiy va mavhum qism nolga teng: 0 + 0-i
complex long double zero;
// bir kompleks sonni boshqasi bilan ishga tushurish
complex double purei2( purei );
Kompleks, vektor singari, shablon bo'lgani uchun, uni yuqoridagi misollardagi kabi, float, double va long double turlari bilan belgilashimiz mumkin. Shuningdek, siz turdagi kompleks elementlarining qatorini aniqlashingiz mumkin:
complex double conjugate[ 2 ] = {
complex double ( 2, 3 ),
complex double ( 2, -3 )
};
Mana bundan aniqlanadi kompleks sonlarga ko’rsatgich va havolalar:
complex double *ptr = conjugate[0];
complex double ref = *ptr;
Kompleks sonlar qo'shilishi, ayirilishi, ko'paytirilishi, bo'linishi, taqqoslanishi, haqiqiy va mavhum qismlarning qiymatlarini olish mumkin.
Massiv qiymatlari sizga vektorlar va matritsalar bilan ishlashni osonlashtirishi mumkin, chunki u juda muhim xususiyatga ega - yozishning soddaligi xususiyati. Masalan, ikkita massivni quyidagicha ko'paytirish mumkin:

1

ar3 = ar1 * ar2;

Juda oddiy kirish, shunday emasmi? Ko'paytirishdan tashqari, qiymatlar qatori boshqa barcha arifmetik amallarni ham qo'llab-quvvatlaydi: +, -, / va hatto qoldiqli bo’lishni ham. Aslida, qiymatlar massivi bir o'lchovli massiv bo'lib, elementlarning raqamlanishi oddiy massivlarda bo'lgani kabi noldan boshlanadi. Qiymatlar qatoridan foydalanish uchun sarlavha faylini ulang - valarray:

1

#include

Massiv qiymatlaridan foydalanishni quyidagi dasturda foydalanib ko’ramiz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#include
#include // massiv qiymatlari uchun bosh fayl yoki kutubxona
#include
#include
using namespace std;
int main()
{
srand(time(NULL));
valarray array1(15); // 15 ta elementli massiv yaratish
valarray array2(15); // 15 ta elementli massiv yaratish

cout << setw(38) << left << "Birinchi massiv: ";


for(int i = 0; i < array1.size(); i++) {
array1[i] = rand() % 10;
cout << setw(2) << array1[i] << " ";
}

cout << endl << setw(38) << "Ikkinchi massiv: ";


for(int i = 0; i < array2.size(); i++) {
array2[i] = rand() % 10;
cout << setw(2) << array2[i] << " ";
}

cout << "\nMassiv elementlari yig’indisi: ";


valarray array3 = array1 + array2;
for(int i = 0; i < array3.size(); i++) {
cout << setw(2) << array3[i] << " ";
}

return 0;


}

Dastur natijasi:
CppStudio.com
Birinchi massiv: 5 3 0 0 1 6 5 3 4 7 1 7 0 0 9
Ikkinchi massiv: 0 5 6 6 0 9 3 8 3 0 8 9 3 7 4
Massiv elementlari yig’indisi: 5 8 6 6 1 15 8 11 7 7 9 16 3 7 13
2-qatorda biz massiv qiymatlar uchun kutubxona chaqiramiz. 9-10 qatorlar, bu massiv qiymatlar e'lon qilish namunasidir. Bunda hech qanday murakkab narsa yo'q, har doimgidek int ma'lumotlar turi birinchi bo'lib ko'rsatiladi. Qavslar ichidagi son bir o'lchovli massivning o'lchamini - elementlar sonini bildiradi.
12-21-qatorlar shunchaki massiv elementlariga tasodifiy qiymatlarni o’zlashtiradi va erranga taqdim qiladi. 24-qatorga e'tibor bering, bu erda bir o'lchovli massivlarni qo'shish jarayoni amalga oshiriladi, bu yozuv faqat bitta qatorda qisqa qilib yozilgan. Oddiymassivlar bilan ham xuddi shunday harakat qilib ko'ring. Siz muvaffaqiyatga erisha olmaysiz, chunki oddiy massivlar bilan siz kamida uchta massivning har bir elementi ustida bajariladigan amalni takrorlanishini amalga oshirishingiz kerak bo'ladi. Valarray orqali siz buni bir qatorda ifodalaysiz:

1

valarray array3 = array1 + array2;

Yozuvlarni shunday soddalashtirish uchun ushbu sinfdan foydalansak arziydi  . Keling, ishni oddiy massiv bilan ko'rib chiqaylik, masalan, bizda bir o'lchovli massiv mavjud:

1

int ar[5] = {1, 7, 34, 23, 56};

Ar massividan foydalanib, massiv ob'ekti yaratamiz. Massiv qiymatlarni e'lon qilishda, birinchi parametrda massiv nomini va ikkinchi parametrda massivning o'lchamini quyidagi misolda ko'rsatilgandek ko'rsatish kifoya:

1

valarray array1(ar, sizeof(ar)/sizeof(ar[0]));

Shunday qilib, biz C ++ statik massiv elementlari tomonidan ishlangan qiymatlar qatoriga ega bo'lamiz. Shuningdek, shuni esdan chiqarmaslik keraki, agar biz ba'zi bir arifmetik amallarni massiv bilan bajarsak, ularning ma'lumotlari turlari bir xil bo'lishi kerak, aks holda xato yuzaga keladi. Mana bir misol:





1
2

valarray array(5);
array = 4 * array; // xatolik

Qism dasturdan ko'rinib turibdiki, unda haqiqiy tipdagi array e’lon qilingan. Shundan so'ng, ikkinchi qatorda, massivning har bir elementini 4ga ko'paytirish bilan amalga oshiriladi, kompilyatsiya natijasida xato bo'ladi:
main.cpp:10: error: no match for ‘operator*’ (operand types are ‘int’ and ‘std::valarray’)
Xatolik ko’paytiruvchining ma'lumotlar turi int ekanligini va ko’payuvchi haqiqiy xususiyatga ega ekanligini ko'rsatadi. Ma'lumot turlari farq qiladi va shuning uchun ko'payishni amalga oshirib bo'lmaydi. Shuning uchun, buni qilishingiz kerak:

1

array = float(4) * array;

Int ma'lumotlar turining o'rniga double ma'lumotlar turi mavjud bo'lsa ham, u ham ma'lumotlar turiga mos kelmaydi. Buni yodda saqlang va bunday xatolarga yo'l qo'ymaslik kerak. Taqqoslash operatorlariga qaytaylik. Boshqa STL konteynerlarida bo'lgani kabi, velarrayda ham relyatsion operatsiyalar ortiqcha yuklangan, ammo ular qaytaradigan natija tubdan farq qiladi. Masalan, quyidagi kodni ko'rib chiqing:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#include
#include // massiv uchun kutubxona
#include
using namespace std;

int main()


{
srand(time(NULL));

// int tipida bo’lgan 5 ta qiymayli ikkita massiv yaratamiz


valarray array1(5);
valarray array2(5);

cout << "Birinchi massiv: ";


for(int i = 0; i < array1.size(); i++) {
cout << (array1[i] = rand() % 10) << " ";
}

array2 = rand() % 10; // array2 massivining barcha qiymatlarini tasodifiy tanlab olamiz


cout << "\nIkkinchi massiv: ";
for(int i = 0; i < array2.size(); i++) {
cout << array2[i] << " ";
}

valarray res(5);


res = (array1 < array2); // ushbu operatsiya natijasida Boolean qiymatlari to'plami qaytariladi


cout << "\nNatija: ";
for(int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}

return 0;


}

19-qatorga qarang, unda biz array2 qiymatlar massivining har bir elementiga tasodifiy sonni beramiz, bunda biz faqat tayinlash operatsiyasidan foydalanamiz. Albatta, dasturning diqqatga sazovor joyi bu 27-satrdagi koddir. Bir qarashda natija bitta mantiqiy qiymatga ega bo'lishi mumkin: rost yoki yolg’on. Bu aslida bunday emas. Aslida, bu bunaqa:

1

res = (array1 < array2);

Quyidagilarni bajaradi:

1
2
3
4
5
6
7

res[0] = (array1[0] < array2[0]);
res[1] = (array1[1] < array2[1]);
res[2] = (array1[2] < array2[2]);
.
.res[n] = (array1[n] < array2[n]);

bu erda n - massivlarning oxirgi elementini ko'rsatadi. Shuning uchun taqqoslash natijasida biz Boolean qiymatlari to'plamini olamiz. Aloqaning qolgan operatsiyalari:>, ==,> =, <= ham harakat qiladi. Oldingi dastur natijasi
Birinchi massiv: 5 7 4 2 2
Ikkinchi massiv: 7 7 7 7 7
Natija: 1 0 1 1 1
Natijada 1-massivning ikkinchi elementi 2-massivning ikkinchi elementidan kam emasligi ko'rinib turibdi, shuning uchun massivdagi ikkinchi element 0 ga teng. Boshqa barcha holatlarda, qiymatlarni taqqoslash natijasi rost bo'lib chiqdi.
Shuningdek, quyidagi funksiyalar mavjudligi to'g'risida bilish sizga foydali bo'ladi:
sum () - bitta to'plam elementlarining yig'indisini qaytaradi;
max () - to'plamning birinchi maksimal qiymatini qaytaradi;
min () - to'plamning birinchi minimal qiymatini qaytaradi;

Qiymatlar massivi bilan ishlashning yana bir kuchli vositasi bu turli xil operatsiyalarni bajarishingiz mumkin bo'lgan pastki to'plamlarni tanlash vositasidir. Masalan, bizda bir qator qiymatlar bor: 1 6 3 6 7 9. Har bir ikkinchi qiymat bilan biz ba'zi bir amallarni bajarishimiz kerak, masalan 1-ni olib tashlash. Ya'ni, ushbu qiymatlar qatorining pastki qismi quyidagicha bo'ladi: 6 6 9. Endi biz ushbu elementlardan 1 ni olamiz, biz shunday pastki to'plamga ega bo'lamiz: 5 5 8. 1 qiymatini olgandan keyin butun qiymatlarning massivi quyidagicha bo'ladi: 1 5 3 5 7 8. Bunday operatsiyalarni bajarish juda oddiy bo'lishi uchun sublar bilan ishlash mexanizmi valarray kutubxonasi ixtiro qilingan. Keyinchalik, buni tushunish juda oson ekanligini ko'rasiz.


Massiv qiymatlaridan biror bir to’plamni ajratib olish mumkin bo’lib, quyidagi qism dasturni qaraymiz.

1

slice(0, 10, 2)

slice () - bu to’plam osti qism hisoblanib, biror usulda qayta ishlanadigan massivning oraliq qiymatlarini aniqlaydigan funktsiya. Slice () funktsiyasi uchta parametrga ega





  • birinchi —tanlash orqali amalga oshirilgan massiv elementining indeksi, masalan indek nolga teng bo’lsa, demak tanlov massivning birinchi elementidan boshlanganini bildiradi.

  • Ikkinchi – massivdagi elementlar soni

  • Uchinchi — tanlov qadami, masalan qadam 2 ga teng bo’lsa, har ikkinchi element to’plamga qo’shilishini anglatadi.

Bundan tashqari, ushbu funktsiyani kvadrat qavs ichida chaqirish kerakligini bilishingiz kerak, masalan:

1

array[slice(0, 10, 2)] = 5;

Ya'ni, ushbu kichik qismning har bir elementiga 5 qiymat berilgan. Keling, slice ni batafsil o'rganish uchun misol dasturini ko'rib chiqamiz.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include
#include // massiv kutubxona fayli

using namespace std;


int main()
{
valarray array(-1, 20);
cout << "Massiv: ";
for(int i = 0; i < array.size(); i++) {
cout << array[i] << " ";
}

array[slice(2, 5, 4)] = 5; // Massivning beshta elementi, 2-indeksdan boshlab 4 ta elementga qadam qo'ygan holda, 5 ga teng qiymat berilgan


array[slice(0, 7, 3)] = 2; // massiv 7 elementi mavjud, 0 – indeksdan boshlanib 3 qadam bilan amalga oshirilganda 2 qiymatga teng bo’lyapti

cout << "\n Massivning keying holati: ";


for(int i = 0; i < array.size(); i++) {
cout << array[i] << " ";
}

//0 – elementdan boshlab, 10 gacha bo’lgan qiymatni har 2 – qadamdagini kvadratga oshiribo’zlashtiradi


array[slice(0, 10, 2)] = pow(static_cast >(array[slice(0, 10, 2)]), 2);

cout << "\n Juft elementlarning kvadrati: ";


for(int i = 0; i < array.size(); i++) {
cout << array[i] << " ";
}
return 0;
}

13-14 satrlarga e'tibor bering, bu chiziqlarda slice () funktsiyasini chaqiramiz. 13 qatorda biz har to'rtinchi elementni tayinlaymiz, indeks 2 bilan, 5 qiymatdan va besh qiymatni tayinlagan elementlardan - beshta bo'lishi kerak, bu ikkinchi parametrda ko'rsatilgan. Biz 14-qatorda shunga o'xshash operatsiyani bajaramiz, ammo bu safar kesilgan parametrlar biroz farq qiladi. Tanlov massivning birinchi elementi bilan boshlanadi, 3 ga ko'payadi va ettita element bilan cheklangan, biz ularga 2 qiymatini tayinlaymiz. Siz quyida ushbu operatsiyalar natijasini ko'rishingiz mumkin:
Massiv: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
Massivning keying holati: 2 -1 5 2 -1 -1 2 -1 -1 2 5 -1 2 -1 5 2 -1 -1 2 -1
Massivning juft elementlarining kvadrati: 4 -1 1 2 25 -1 4 -1 1 2 1 -1 4 -1 1 2 1 -1 4 -1
22-qatorda biz yana slice() dan foydalandik. Bu safar, biz pow() funksiyasidan foydalangan holda pastki qismning har bir elementini kvadratiga ega bo'lamiz. Aytgancha, standart (matematik) pow (), sqrt () va boshqa funksiyalar qiymatlar qatori bilan ishlashiga e'tibor bering. Ammo, bir parametr sifatida, power () funksiyasi static_cast operatsiyasidan foydalanib, valarray ma'lumotlar turiga argument berilganligini payqash mumkin emas. Afsuski, deyarli har doim pastki qismlarni valarray turiga aniq o'zgartirish kerak. Buning sababi, standart kutubxona pastki to'plamlar to'plamlar bilan bir xil operatsiyalarni qo'llab-quvvatlayotganligini bildirmaydi

Massiv: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1


Massivning keying holati: 2 -1 5 2 -1 -1 2 -1 -1 2 5 -1 2 -1 5 2 -1 -1 2 -1
Massivning juft elementlarining kvadrati: 4 -1 1 2 25 -1 4 -1 1 2 1 -1 4 -1 1 2 1 -1 4 -1
22-qatorda biz yana slice() dan foydalandik. Bu safar, biz pow() funksiyasidan foydalangan holda pastki qismning har bir elementini kvadratiga ega bo'lamiz. Aytgancha, standart (matematik) pow (), sqrt () va boshqa funksiyalar qiymatlar qatori bilan ishlashiga e'tibor bering. Ammo, bir parametr sifatida, power () funksiyasi static_cast operatsiyasidan foydalanib, valarray ma'lumotlar turiga argument berilganligini payqash mumkin emas. Afsuski, deyarli har doim pastki qismlarni valarray turiga aniq o'zgartirish kerak. Buning sababi, standart kutubxona pastki to'plamlar to'plamlar bilan bir xil operatsiyalarni qo'llab-quvvatlayotganligini bildirmaydi
Tashqi parchalanishga misol
Shuningdek qarang: C dinamik xotirani ajratish
Ajratish haqidagi so'rovni bajarish vazifasi etarli hajmdagi foydalanilmagan xotira blokini topishdan iborat. Deb nomlangan katta xotira fondidan qismlarni ajratish orqali xotira talablari qondiriladi uyum yoki bepul do'kon.[eslatma 1] Har qanday vaqtda, uyumning ba'zi qismlari ishlatilmoqda, ba'zilari esa "bepul" (foydalanilmayapti) va shu bilan kelajakda ajratish uchun mavjud.
Kabi bir nechta muammolar amalga oshirishni murakkablashtiradi tashqi parchalanish ajratilgan xotira bloklari orasida juda ko'p kichik bo'shliqlar mavjud bo'lganda paydo bo'ladi, bu ularni ajratish so'rovi uchun ishlatilishini bekor qiladi. Ajratuvchi metadata kichik ajratmalar hajmini ham ko'paytirishi mumkin. Bu ko'pincha tomonidan boshqariladi chunking. Xotirani boshqarish tizimi bir-birining ustma-ust tushmasligi va hech qachon xotira "yo'qolmasligi" (ya'ni, yo'qligi) uchun ularni ajratib turishini ta'minlashi kerak.xotira sızdırıyor ").
Samaradorlik
Amalga oshirilgan maxsus dinamik xotirani taqsimlash algoritmi ishlashga sezilarli ta'sir ko'rsatishi mumkin. Tomonidan 1994 yilda o'tkazilgan tadqiqot Raqamli uskunalar korporatsiyasi tasvirlaydi qo'shimcha xarajatlar turli xil ajratuvchilar uchun jalb qilingan. O'rtacha eng past ko'rsatkich ko'rsatma yo'lining uzunligi bitta xotira uyasini ajratish uchun talab qilingan 52 (ko'rsatma darajasi bilan o'lchanganidek) profiler turli xil dasturiy ta'minotlarda).[3]
Amaliyotlar
Ajratishning aniq joyi oldindan ma'lum bo'lmaganligi sababli, xotiraga bilvosita, odatda a orqali kirish mumkin ko'rsatgich ma'lumotnoma. Xotira maydonini tashkil qilish va qismlarni ajratish va taqsimlash uchun ishlatiladigan o'ziga xos algoritm. Bilan o'zaro bog'liq yadro va quyidagi usullardan birini qo'llashi mumkin:
Ruxsat etilgan o'lchamdagi bloklarni taqsimlash
Asosiy maqola: Xotira havzasi
Aniq o'lchamdagi bloklarni taqsimlash, shuningdek xotira havzasini ajratish deb nomlanadi bepul ro'yxat xotiraning doimiy o'lchamdagi bloklari (ko'pincha barchasi bir xil o'lchamda). Bu oddiy uchun yaxshi ishlaydi o'rnatilgan tizimlar bu erda katta ob'ektlarni ajratish kerak emas, lekin zarar ko'radi parchalanish, ayniqsa, uzoq xotira manzillari bilan. Biroq, sezilarli darajada kamaytirilgan qo'shimcha xarajatlar tufayli ushbu usul tez-tez ajratish / ajratishni talab qiladigan va ko'pincha ishlatiladigan ob'ektlar uchun ishlashni sezilarli darajada yaxshilashi mumkin. video O'yinlar.
Buddy bloklari
Qo'shimcha ma'lumotlar: Do'stlar xotirasini ajratish
Ushbu tizimda xotira bittasi o'rniga bir nechta xotira havzalariga ajratilgan, bu erda har bir hovuz ma'lum bir xotiraning bloklarini aks ettiradi ikkitasining kuchi kattaligi yoki boshqa qulay o'lchamdagi bloklar. Muayyan o'lchamdagi barcha bloklar tartiblangan holda saqlanadi bog'langan ro'yxat yoki daraxt va ajratish paytida hosil bo'lgan barcha yangi bloklar keyinchalik foydalanish uchun tegishli xotira havzalariga qo'shiladi. Agar mavjud bo'lganidan kichikroq hajm talab qilinsa, mavjud bo'lgan eng kichik o'lcham tanlanadi va bo'linadi. Olingan qismlardan biri tanlanadi va jarayon so'rov tugaguniga qadar takrorlanadi. Blok ajratilganda, blokirovkalash keraksiz bloklardan saqlanish uchun eng kichik etarlicha katta blokdan boshlanadi. Blok bo'shatilganda, uning do'sti bilan taqqoslanadi. Agar ularning ikkalasi ham bepul bo'lsa, ular birlashtirilib, mos ravishda kattaroq hajmdagi do'stlar bloklari ro'yxatiga joylashtiriladi.
Plitalarni ajratish
Asosiy maqola: Plitalarni ajratish
Ushbu xotirani taqsimlash mexanizmi ma'lum turdagi yoki o'lchamdagi moslamalarga mos keladigan xotira qismlarini oldindan taqsimlaydi.[4] Ushbu qismlar keshlar deb ataladi va ajratuvchi faqat bo'sh keshlar ro'yxatini kuzatishi kerak. Ob'ektni qurish bepul kesh uyalaridan birini ishlatadi va ob'ektni yo'q qilish, bo'sh keshlar ro'yxatiga bo'sh joyni qo'shadi. Ushbu texnik xotira parchalanishini engillashtiradi va samaralidir, chunki xotiraning tegishli qismini qidirishning hojati yo'q, chunki har qanday ochiq uyasi etarli bo'ladi.
Stekni taqsimlash
Asosiy maqola: Stekka asoslangan xotirani ajratish
Ko'pchilik Unixga o'xshash tizimlar, shuningdek Microsoft Windows deb nomlangan funktsiyani amalga oshirish alloka stack xotirani uyumga o'xshash tarzda dinamik ravishda taqsimlash uchun malloc. Odatda kompilyator uni stack ko'rsatgichi bilan ishlaydigan chiziqli ko'rsatmalarga tarjima qiladi.[5] Garchi bu tarzda ajratilgan xotirani qo'lda bo'shatishga hojat bo'lmasa ham, u chaqirilgan funktsiya avtomatik ravishda bo'shatiladi alloka qaytib keladi, toshib ketish xavfi mavjud. Va alloka an maxsus kengayish ko'plab tizimlarda kuzatilgan, ammo hech qachon POSIX yoki C standartlarida ishlamaydi, stack overflow holatida uning harakati aniqlanmagan.
Allokaning xavfsiz versiyasi deb nomlangan _malloca, xatolar haqida xabar beradigan, Microsoft Windows-da mavjud. Buning ishlatilishini talab qiladi _freea.[6] gnulib SEH istisnoini toshib yuborish o'rniga, ekvivalent interfeysni taqdim etadi, kattalashtirilgan kattalik aniqlanganda malloc-ga vakolat beradi.[7] Shunga o'xshash xususiyatni qo'lda hisobga olish va o'lchamlarini tekshirish yordamida taqlid qilish mumkin, masalan alloca_account glibc-da.[8]
Avtomatik o'zgaruvchilar
Asosiy maqola: Avtomatik o'zgaruvchi
Ko'pgina dasturlash tillarini amalga oshirishda protsedura ichida e'lon qilingan barcha o'zgaruvchilar (subroutine yoki function) ushbu funktsiya uchun mahalliy hisoblanadi; dastur uchun ish vaqti muhiti, protseduraga dasturning bajarilishini kiritishda ushbu o'zgaruvchilar uchun avtomatik ravishda xotirani ajratadi va protsedura chiqqandan keyin ushbu xotirani avtomatik ravishda chiqaradi. Maxsus deklaratsiyalar mahalliy o'zgaruvchilarga protsedura chaqiruvlari orasidagi qiymatlarni saqlab qolishlariga yoki mahalliy o'zgaruvchilarga boshqa protseduralar orqali kirishga imkon berishi mumkin. Mahalliy o'zgaruvchilarni avtomatik ravishda taqsimlash amalga oshiriladi rekursiya mavjud bo'lgan xotira bilan cheklangan chuqurlikda.
Axlat yig'ish
Asosiy maqola: Axlat yig'ish (informatika)
Axlat yig'ish - bu dasturda foydalanishga yaroqsiz bo'lgan ob'ektlarga ajratilgan xotirani avtomatik ravishda aniqlash va ajratilgan xotirani bo'sh xotira joylariga qaytarish strategiyasi. Ushbu usul "qo'lda" xotirani boshqarishdan farq qiladi, bu erda dasturchi xotiradagi so'rovlarni va dasturdagi xotirani chiqarishni aniq kodlaydi. Avtomatik chiqindilar dasturchilarning ish yukini kamaytirish va xotirani taqsimlashdagi ba'zi turdagi xatolarning oldini olish kabi afzalliklarga ega bo'lsa-da, axlat yig'ish uchun o'ziga xos xotira resurslari kerak va protsessor vaqti uchun dastur bilan raqobatlasha oladi.
Virtual xotiraga ega tizimlar
Asosiy maqolalar: Xotirani himoya qilish va Umumiy xotira (protsesslararo aloqa)
Virtual xotira - bu xotirani tashkil qilishni fizikaviy apparatdan ajratish usuli. Ilovalar xotirada ishlaydi virtual manzillar. Ilovaning ma'lum bir virtual xotira manziliga kirish uchun har bir urinishi virtual xotira manzilini haqiqiyga tarjima qilishga olib keladi jismoniy manzil. Shu tarzda virtual xotira qo'shilishi xotira tizimlari va kirish usullari ustidan donador nazoratni ta'minlaydi.
Virtual xotira tizimlarida operatsion tizim qanday cheklanganligini cheklaydi jarayon xotiraga kira oladi. Ushbu xususiyat, deb nomlangan xotirani himoya qilish, xotira uchun ajratilmagan o'qish yoki yozish jarayonini taqiqlash, bir dasturdagi zararli yoki noto'g'ri ishlaydigan kodni boshqasining ishlashiga xalaqit berishiga yo'l qo'ymaslik uchun ishlatilishi mumkin.
Muayyan jarayonlar uchun ajratilgan xotira odatda izolyatsiya qilingan bo'lsa ham, ba'zida jarayonlar ma'lumot almashish imkoniyatiga ega bo'lishi kerak. Umumiy xotira uchun eng tezkor usullardan biridir jarayonlararo aloqa.
Xotira odatda kirish tezligi bo'yicha tasniflanadi asosiy saqlash va ikkilamchi saqlash. Xotirani boshqarish tizimlari, boshqa operatsiyalar qatori, ushbu ikki xotira darajasi o'rtasida ma'lumot almashinuvini ham boshqaradi.
OS / 360 da xotirani boshqarish va vorislar
IBM Tizim / 360 virtual xotirani qo'llab-quvvatlamaydi.[2-eslatma] Xotirani ajratish ish joylari ixtiyoriy ravishda yordamida amalga oshiriladi himoya kalitlari, har bir ish uchun saqlash joyini boshqacha kalit bilan belgilash, nazoratchi uchun 0 yoki 1-15. Xotirani boshqarish OS / 360 a nazoratchi funktsiya. Saqlash GETMAIN so'l yordamida va ozod qilingan Bepul makro, natijada rahbarga qo'ng'iroq qilish (SVC ) operatsiyani bajarish uchun.
OS / 360 da tafsilotlar tizimning mavjudligiga qarab farqlanadi hosil qilingan uchun PCPMFT yoki MVT.
OS / 360 MVT da ish joyidagi suballocation mintaqa yoki birgalikda Tizimning navbat maydoni (SQA) asoslanadi subpools, hajmi 2 KB dan kattaroq maydonlar - himoya kaliti bilan himoyalangan maydonning kattaligi. Subpools 0-255 raqamlangan, shuningdek yuklangan dasturlarni saqlash uchun foydalaniladigan raqamsiz subpool.[2] Mintaqada subpools-larga ishni saqlashni muhofaza qilish yoki nazoratchining kaliti, 0-kalit beriladi. 0–126-sonli chaqiruvlar ish kalitini oladi. Dastlab faqat raqamlanmagan subpool va subpool nollari yaratiladi va barcha xotira so'rovlarida boshqasi ko'rsatilmagan bo'lsa, 0 subpool-dan foydalanuvchining barcha saqlash talablari qondiriladi. 250–255 ta chaqiruv punktlari ish nomidan rahbar tomonidan xotira so'rovlari bilan tuziladi. Ularning aksariyati 0 tugmachasiga ega, garchi bir nechtasi ishning kalitini oladi. MFT sobit foydalanadi bo'limlar operator tomonidan dinamik hududlar o'rniga qayta aniqlanadigan va PCP faqat bitta bo'limga ega.
Har bir subpool ostidagi ajratilgan va bo'sh xotira bloklarini aniqlaydigan boshqaruv bloklari ro'yxati bilan xaritada joylashgan. Xotira etarli hajmdagi bo'sh maydonni topish yoki ishning mintaqaviy kattaligiga qadar qo'shimcha bloklarni ajratish orqali ajratiladi. Ajratilgan xotira maydonini to'liq yoki bir qismini bo'shatish mumkin.[9]
Uchun tafsilotlar OS / VS1 MFT va tafsilotlari bilan o'xshash OS / VS2 MVT-ga o'xshash, faqat sahifa hajmi 4 KiB. Ham OS / VS1, ham OS / VS2 uchun birgalikda foydalaniladi Tizimning navbat maydoni (SQA) sahifaga yaroqsiz.
Yilda MVS manzil maydoni qo'shimcha sahifalanadigan umumiy maydonni o'z ichiga oladi Umumiy saqlash maydoni (CSA) va qo'shimcha xususiy maydon Tizimning ish maydoni (SWA). Bundan tashqari, 0-7 saqlash tugmachalari hammasi imtiyozli kodlar uchun ishlatilgan.
2.Raqamli sinflar va ular bilan ishlash (complex, vallaray, slice,gslice va b.sh)
Kirish

Oliy matematk kursida komleks sonlar bilan tanishgansizlar.
Ta’rif. Tartiblangan ikkita haqiqiy sonlar juftligi bolib, asosan standart ko’rinisda
a+bi (Dekart koorditalar tisimida) yoki (a,b)
beriladi. Bu erda:
a – uning butun qismi, bo’lib, haqiqiy sonlar to’plamiga tegishli;
b – uning mavhum qismi bo’lib, haqiqiy sonlar to’plamiga tegishli;
i – qiymati ga teng bo’lgan irratsional son;

Komplex sonnig qutb koordinatalar tizimidagi ko’rinishi:


z= p(cosα+isinα)
Bu erda:
p – complex sonning absolyut qiymati deyiladi, va
;
α – vektorning Ox o’qi bilan hosil qilgan burchagi
i – qiymati ga teng bo’lgan irratsional son;
Komplex sonlar ustida to’rtta arifmetik amallar quyidagi algoritm (formulalar) yordamida amalga oshiriladi:
z1=a+bi va z2=c+di 2 ta complex son uchun -
1) z1+z2=(a+c)+(b+d)i= ((a+c),(b+d)) - qo’shish
2) z1-z2=(a-c)+(b-)i= ((a-c),(b-d)) - ayirish
3) z1·z2=(ac-bd) +(ad+bc)i=((ac-bd),(ad+bc)) - ko’paytirish
4) – bo’lish

C ++ standart kutubxonasining kompleks son sinfi ob'ekt modelidan foydalanishning yaxshi namunasidir. Ortiqcha arifmetik operatsiyalar tufayli ushbu klass ob'ektlari o'rnatilgan ma'lumotlar turlaridan biriga tegishlicha ishlatiladi. Bundan tashqari, o'rnatilgan arifmetik turdagi o'zgaruvchilar va murakkab raqamlar bir vaqtning o'zida bunday operatsiyalarda ishtirok etishlari mumkin.


1. Raqamli sinflar va ular bilan ishlash.

C ++ standart kutubxonasining kompleks son sinfi ob'ekt modelidan foydalanishning yaxshi namunasidir. Ortiqcha arifmetik operatsiyalar tufayli ushbu sinf ob'ektlari o'rnatilgan ma'lumotlar turlaridan biriga tegishlicha ishlatiladi. Bundan tashqari, o'rnatilgan arifmetik turdagi o'zgaruvchilar va kompleks sonlar bir vaqtning o'zida bunday operatsiyalarda ishtirok etishlari mumkin. (E'tibor bering, bu erda biz murakkab sonlar matematikasining umumiy masalalariga murojaat qilmaymiz. Qarang [PERSON68] yoki matematikaga oid biron bir kitob.)

Masalan:


Download 417.45 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   13




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