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


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


O’ZBEKISTON RESPUBLIKASI
AXBOROT TEXNOLOGIYALARI VA KOMMUNIKATSIYALARINI
RIVOJLANTIRISH VAZIRLIGI
MUHAMMAD AL-XORAZMIY NOMIDAGI TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
QARSHI FILIALI


KOMPYUTER INJINIRINGI FAKULTETI
AXBOROT XAVFSIZLIGI YO’NALISHI
I-BOSQICH AX-11-22 GURUH TALABASI
HAMDULLAYEV MEXROJNING
DASTURLASH
FANIDAN TAYYORLAGAN
3-MUSTAQIL ISHI

Bajardi: HAMDULLAYEV MEXROJ
Qabul qildi: LAZIZ XUDOYOROV


QARSHI-2023

REJA:
1.Xotirani taqsimlash va unga qo`yiladigan talablar.


Standart taqsimlash
2.Raqamli sinflar va ular bilan ishlash (complex, vallaray, slice,gslice va b.sh)
3.Murakkab saralash algoritmlari.
4.Juda katta raqamlar bilan ishlash.
5.Large sinfi qo`llash.
1.Xotirani taqsimlash va unga qo`yiladigan talablar.
Xotirani boshqarish - Memory management
"Xotira ajratish" bu erga yo'naltiriladi. Miyada xotirani ajratish uchun qarang Xotirani neyronal taqsimlash.
Ushbu maqola an manzil maydoni. Jismoniy xotirani boshqarish uchun qarang Xotirani boshqarish (operatsion tizimlar).



Ushbu maqola umumiy ro'yxatini o'z ichiga oladi ma'lumotnomalar, lekin bu asosan tasdiqlanmagan bo'lib qolmoqda, chunki unga mos keladigan etishmayapti satrda keltirilgan. Iltimos yordam bering takomillashtirish tomonidan ushbu maqola tanishtirish aniqroq iqtiboslar. (2014 yil aprel) (Ushbu shablon xabarini qanday va qachon olib tashlashni bilib oling)



Operatsion tizimlar




Umumiy xususiyatlar

  • Jarayonlarni boshqarish

  • Uzilishlar

  • Xotirani boshqarish

  • Fayl tizimi

  • Qurilma drayverlari

  • Tarmoq

  • Xavfsizlik

  • I / O


Xotirani boshqarish shaklidir resurslarni boshqarish uchun qo'llaniladi kompyuter xotirasi. Xotirani boshqarishning muhim talabi shundan iboratki, dasturlarga ularning talabiga binoan xotira qismlarini dinamik ravishda taqsimlash va kerak bo'lmaganda uni qayta ishlatish uchun bo'shatish. Bu bitta kompyuterdan ko'proq bo'lgan har qanday rivojlangan kompyuter tizimi uchun juda muhimdir jarayon har qanday vaqtda bo'lishi mumkin.[1]
Xotirani boshqarish samaradorligini oshiradigan bir necha usullar ishlab chiqilgan. Virtual xotira tizimlar ajratib turadi xotira manzillari protsessni ajratish va hajmini oshirishga imkon beradigan haqiqiy jismoniy manzillardan jarayon tomonidan foydalaniladi virtual manzil maydoni mavjud miqdordan tashqari Ram foydalanish xotira yoki almashtirish ikkilamchi saqlash. Virtual xotira menejerining sifati umumiy tizimga katta ta'sir ko'rsatishi mumkin ishlash.
Mundarija

  • 1 Tafsilotlar

    • 1.1 Xotirani dinamik ravishda taqsimlash

      • 1.1.1 Samaradorlik

      • 1.1.2 Amaliyotlar

        • 1.1.2.1 Ruxsat etilgan o'lchamdagi bloklarni taqsimlash

        • 1.1.2.2 Buddy bloklari

        • 1.1.2.3 Plitalarni ajratish

        • 1.1.2.4 Stekni taqsimlash

    • 1.2 Avtomatik o'zgaruvchilar

      • 1.2.1 Axlat yig'ish

  • 2 Virtual xotiraga ega tizimlar

  • 3 OS / 360 da xotirani boshqarish va vorislar

  • 4 Shuningdek qarang

  • 5 Izohlar

  • 6 Adabiyotlar

  • 7 Qo'shimcha o'qish

  • 8 Tashqi havolalar

Tafsilotlar



Ushbu bo'lim kengayishga muhtoj. Siz yordam berishingiz mumkin unga qo'shilish(2016 yil noyabr)

Ba'zi operatsion tizimlarda, masalan, DOS / 360 va vorislariOS / 360 va vorislari,[2]:74 manzil maydonida saqlashni ajratish operatsion tizim tomonidan amalga oshiriladi; masalan, Unixga o'xshash operatsion tizimlar, ichida ajratish manzil maydoni dastur darajasida.
Manzil maydonidagi xotirani boshqarish odatda avtomatik ravishda boshqarishni o'z ichiga olgan avtomatik xotira boshqaruvi deb tasniflanadi axlat yig'ish, yoki xotirani qo'lda boshqarish.
Xotirani dinamik ravishda taqsimlash
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:
#inc1ude


comp1ex< double > a;
comp1ex< double > b; // ...
complex< double > с = a * b + a / b;
Kompleks va arifmetik turlarni bitta ifoda bilan aralashtirishga ruxsat beriladi:
complex< double > complex_obj = a + 3.14159;
Xuddi shunday, kompleks sonlar arifmetik tur bilan initsializatsiya qilinadi va ularga quyidagicha qiymat berilishi mumkin:
double dval = 3.14159;
complex_obj = dval;
yoki
int ival = 3;
complex_obj = ival;
Masalan, quyidagi ifoda kompilyatsiya xatosiga olib keladi:
// xato: arifmetik turga aniq konversiya qilinmaydi
double dval = complex_obj;

Kompleks sonning qaysi qismini - haqiqiy yoki mavhum - biz muntazam raqamga belgilashni xohlayotganimizni aniq ko'rsatishimiz kerak. Kompleks sonlar sinfi mos ravishda haqiqiy va mavhum qismlarni qaytaradigan ikkita funksiyaga ega. Biz ularga sinf a'zolariga kirish uchun sintaksis yordamida kirishimiz mumkin:


double re = complex_obj.real();


double im = complex_obj.imag();
yoki shunga o'xshash funktsiyani chaqirish sintaksisi:
double re = real(complex_obj);
double im = imag(complex_obj);
Kompleks son sinfi to'rtta kompozitsion tayinlash operatorlarini qo'llab-quvvatlaydi: + =, - =, * = va / =. Shunday qilib,
complex_obj += second_complex_obj;

Kompleks sonlarni Qo'llab-quvvatlaydigan kirish / chiqish . Chiqish operatori vergul bilan ajratilgan haqiqiy va mavhum qismlarni qavs ichiga bosib chiqaradi. Masalan, chiqish bayonotlarini bajarish natijasi


complex< double > complex0( 3.14159, -2.171 );


comp1ex< double > complex1( complexO.real() );
cout << complexO << " " << complex1 << endl;
quyidagicha:
( 3.14159, -2.171 ) ( 3.14159, 0.0 )
Kirish operatori quyidagi formatlarning istalganini tushunadi.
// kompleks sonlarni kiritish uchun ruxsat etilgan tiplari
// 3.14159 ==> comp1ex( 3.14159 );
// ( 3.14159 ) ==> comp1ex( 3.14159 );
// ( 3.14, -1.0 ) ==> comp1ex( 3.14, -1.0 );
// sifatida o'qish mumkin
// cin >> a >> b >> с
// bu yerda a, b, с – kompleks sonlar
3.14159 ( 3.14159 ) ( 3.14, -1.0 )
Ushbu operatsiyalarga qo'shimcha ravishda, kompleks sonlar sinfida quyidagi a'zo funksiyalariga ega: sqrt(), abs(), polar(), sin(), cos(), tan(), exp(), log(), log10() va pow().
Mashq 4.9

Biz uchun mavjud bo'lgan C ++ standart kutubxonasining joriy etilishi, agar to'g'ri operand kompleks son bo'lmasa, murakkab tarkibiy operatsiyalarini qo'llab-quvvatlamaydi. Masalan, shunga o'xshash yozuv haqiqiy emas:


complex_obj += 1;

(C ++ standartiga binoan, bunday ifoda to'g'ri bo'lishi kerak, ishlab chiqaruvchilar ko'pincha standartga rioya qilmaydilar.) Bunday operatsiyani bajarish uchun biz o'z operatorimizni aniqlay olamiz. Bu yerda complex uchun qo'shimcha operatorni amalga oshiradigan funksiyaning varianti:


#include
inline complex&
operator+=( complex &cval, double dval )
{
return cval += complex( dval );
}

Ushbu misoldan foydalanib, complex turi uchun yana uchta boshqa tayinlash operatorlarini amalga oshiring. Amaliyatingizni quyidagi dasturga qo'shing va tekshirish uchun ishga tushiring.


#include
#include
// определения операций...
int main() {
complex< double > cval ( 4.0, 1.0 );
cout << cval << endl;
cval += 1;
cout << cval << endl;
cval -= 1;
cout << cval << endl;
cval *= 2;
cout << cval << endl;
cout /= 2;
cout << cval << endl;
}
Mashq 4.10
C ++ standartida kompleks son uchun o'sish va kamaytirish operatsiyalarining bajarilishi ko'rsatilmagan. Ammo, ularning semantikasi tushunarli: agar biz yoza olsak:
cval + = 1;
bu Cvalning haqiqiy qismining 1 ga ko'payishini anglatadi, bu holda o'sish jarayoni juda qonuniy ko'rinishi mumkin. Ushbu operatsiyalarni complex turi uchun bajaring va quyidagi dasturni ishlating:

#include


#include
// определения операций...
int main() {

complex< double > cval( 4.0, 1.0 );


cout << cval << endl;

++cva1;

cout << cval << endl;

}
C ++ 98 massivlarda matematik operatsiyalarni samarali saqlash va ta'minlash uchun maxsus valarray konteynerini taqdim etdi.


 elementlarga asoslangan matematik operatsiyalarni va umumlashtirilgan indeksi, qism va bilvosita kirish operatorlarining har xil shakllarini qo'llab-quvvatlaydi.
 vektorlar bilan taqqoslaganda, vektorlar ma'lum matematik operatsiyalarda vektorlarga qaraganda samaraliroq.

Valarray sinfida ochiq funksiya a’zolari:


1-й 1. apply () : —Ushbu funksiya o'z argumentlarida ko'rsatilgan manipulyatsiyalarni bir vaqtning o'zida barcha valarray elementlariga qo'llaydi va manipulyatsiyalangan qiymatlarga ega yangi valarray ni qaytaradi.
2. sum () : — Ushbu funktsiya bir vaqtning o'zida barcha valarray elementlarining yig'indisini qaytaradi.
// Ishni namoyish qilish uchun C ++ kodi
// apply () va sum ()
#include
#include // for valarray functions
using namespace std;
int main()
{
// valarray ishga tushushi
valarray varr = { 10, 2, 20, 1, 30 };
// Yangi valarray ni e’lon qilish
valarray varr1 ;
// barcha elementlarni 5ga oshirish uchun apply () dan foydalanish
varr1 = varr.apply([](int x){return x=x+5;});
// yangi elementlar qiymatlarini ko’rish
cout << "The new valarray with manipulated values is : ";
for (int &x: varr1) cout << x << " ";
cout << endl;
// valarray Oldingi va keying yig’indilarni ko’rish
cout << "The sum of old valarray is : ";
cout << varr.sum() << endl;
cout << "The sum of new valarray is : ";
cout << varr1.sum() << endl;
return 0;
}
Natija:
The new valarray with manipulated values is : 15 7 25 6 35
The sum of old valarray is : 63
The sum of new valarray is : 88
3. min () : — Bu funksiya valarray elementining eng kichigini qaytaradi.
4. max () : — Bu funksiya valarray elementining eng kattasiini qaytaradi.
// Ishni namoyish qilish uchun C ++ kodi
// max () va min ()
#include
#include // for valarray functions
using namespace std;
int main()
{
// valarray ni ishga tushurish
valarray varr = { 10, 2, 20, 1, 30 };

// valarray ning eng katta elementini ko’rsatadi


cout << "The largest element of valarray is : ";
cout << varr.max() << endl;

// valarray ning eng kichik elementini ko’rsatadi


cout << "The smallest element of valarray is : ";
cout << varr.min() << endl;

return 0;


}
Natija:


The largest element of valarray is : 30
The smallest element of valarray is : 1
5. Shift (): —Ushbu funksiya elementlarni argument sifatida ko'rsatilgan raqamga o'tkazgandan so'ng, yangi valarray ni qaytaradi. Agar raqam musbat bo'lsa, chap siljish qo'llaniladi, agar salbiy bo'lsa, o'ng tomonga siljish qo'llaniladi.
6. CSHIFT (): — Ushbu funktsiya argument sifatida ko'rsatilgan raqam bo'yicha elementlarni aylantirgan (aylantirgan) dan keyin yangi valarrayni qaytaradi. Agar raqam musbat bo'lsa, chap siljish va aylana qo'llaniladi, agar son salbiy bo'lsa, chap siljish qo'llaniladi.
// Ishni namoyish qilish uchun C ++ kodi
// shift () и cshift ()
#include
#include // for valarray functions
using namespace std;
int main()
{
// valarray ni ishga tushurish
valarray varr = { 10, 2, 20, 1, 30 };

// yangi valarrayni e’lon qilish


valarray varr1;

// elementlarni chapga siljitish uchun shift () foydalaniladi


// valarray ni 2ta o’ringa surish
varr1 = varr.shift(2);

//elementlar surilgan keyin valarray ko’rinishi


cout << "The new valarray after shifting is : ";
for ( int&x : varr1) cout << x << " ";
cout << endl;

// elementlarni o'ngga aylantirish uchun cshift () dan foydalaning


// 3 ta o'ringa siljitish
varr1 = varr.cshift(-3);

// Dumaloq aylanishdan keyin valarray elementlarini ko’rish


cout << "The new valarray after circular shifting is : ";
for ( int&x : varr1) cout << x << " ";
cout << endl;

return 0;


}
Выход:


The new valarray after shifting is : 20 1 30 0 0
The new valarray after circular shifting is : 20 1 30 10 2
7. swap () : — Bu funksiya bir valarray ni boshqasiga o’zgartiradi.
// C ++ da swap() ni ishlatish uchun masala
#include
#include // for valarray functions
using namespace std;
int main()
{
// 1- valarray ishga tushushi
valarray varr1 = {1, 2, 3, 4};

// 2- valarray ishga tushushi


valarray varr2 = {2, 4, 6, 8};

// O’zgarishdan oldingi qiymatlarni ko’rish


cout << "The contents of 1st valarray "
"before swapping are : ";
for (int &x : varr1)
cout << x << " ";
cout << endl;
cout << x << " ";

cout << "The contents of 2nd valarray "


"before swapping are : ";
for (int &x : varr2)
cout << endl;

//Qiymatlarni almashtirish uchun swap () dan foydalanish


varr1.swap(varr2);

// Qiymatlarni almashishdan keying holati


cout << "The contents of 1st valarray "
"after swapping are : ";
for (int &x : varr1)
cout << x << " ";
cout << endl;

cout << "The contents of 2nd valarray "


"after swapping are : ";
for (int &x : varr2)
cout << x << " ";
cout << endl;

return 0;


}
Выход:


The contents of 1st valarray before swapping are : 1 2 3 4
The contents of 2nd valarray before swapping are : 2 4 6 8
The contents of 1st valarray after swapping are : 2 4 6 8
The contents of 2nd valarray after swapping are : 1 2 3 4

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: Kirish
Oliy matematk kursida komleks sonlar bilan tanishgansizlar.

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