2. 2§. Indeksatorning turi va uning parametrlari turlari haqida


Asosiy massivsiz indeksatorlar. Indeksatorlarni ortiqcha yuklash


Download 0.67 Mb.
bet17/18
Sana03.02.2023
Hajmi0.67 Mb.
#1151810
1   ...   10   11   12   13   14   15   16   17   18
Bog'liq
19.08 A Tojiyeva Saboxon Dasturlash kurs ishi

 Asosiy massivsiz indeksatorlar. Indeksatorlarni ortiqcha yuklash


Indexer burchakli Qavslar foydalanib, bir qator kabi indeksi bir ob'ekt imkonini beradi C # tili xususiyati hisoblanadi [] . Indeksatorlardan foydalanib, siz turli xil cheklovlarga duch keladigan o'zingizning ixtisoslashtirilgan massivlaringizni amalga oshirishingiz mumkin.
Indeksatorlarni dasturlarda ishlatish uchun indeksatorni o'z ichiga olgan sinfni e'lon qilishingiz kerak. Sinf ichki qatorga ega bo'lishi mumkin, uning elementlariga indeksator yordamida kirish mumkin. Sinfni indeksator bilan e'lon qilgandan so'ng, siz ushbu sinf ob'ektini massiv sifatida ishlatishingiz mumkin (kvadrat qavslardan foydalanib [] ). Indeksatordan foydalanish uchun uni ommaviy deb e'lon qilish kerak.
Massivlar singari indeksatorlar ham bir o'lchovli yoki ko'p o'lchovli bo'lishi mumkin.
Ba'zi bir sinflarda indeksatorni e'lon qilishning umumiy shakli:
yozing , bu [ type_index indeks ]
{
olish
{
// indeksdagi qiymatni qaytaradigan kod
// ...
}
o'rnatilgan
{
// qiymatni indeks bo'yicha belgilaydigan kod
// ...
}
}
Indeksator turlari.

  • tip - indeksator elementining turi;

  • indeks - elementga erishilgan massivdagi indeks yoki pozitsiya;

  • type_index - indeksatorning indeks turi (pozitsiyasi). Odatda, bu int turi. Biroq, boshqa turlarga ruxsat beriladi (masalan, ikkilamchi , char );

  • bu indeksator amalga oshirilgan berilgan sinfga havola;

  • get , set - mos ravishdaelementning qiymatinio'qish ( olish ) va elementga qiymatini yozish ( set ).

2.5§.Indeksator va xossalar yordamida misollar yechish.
Bir-o'lchovli indeksator e'lon 2. misol, deb qaytib bir char qiymati

Bir o'lchovli indeksator bir o'lchovli massivga to'g'ri keladi. Misol indeksatorni o'z ichiga olgan CharArray sinfini e'lon qiladi .
//
CharArray indeksator sinfini o'z ichiga olgan sinf
{
char [] A;


// class constructor
public CharArray ( int size)
{
agar (hajmi> 26) hajmi = 26;
A = yangi char [size];
uchun ( int i = 0; i A [i] = ( char ) (( int ) 'A' + i);
}


// indeksatorni
umumiy char deb e'lon qilish [ int index]
{
get // pozitsiya indeksidan o'qing
{
if ((index> = 0) && (index return A [index];
aks holda
"A" qaytish ;
}
set // pozitsiya indeksiga yozish
{
agar ((indeks> = 0) && (indeks A [indeks] = qiymat ;
}
}
}
Yuqoridagi kod char elementlarining qiymatini qaytaradigan indeksatorni e'lon qiladi . Indeks qiymatlari int turiga ega .
Indeksator ikkita kirishni amalga oshiradi: get , set . Aksessuarlarni amalga oshirish tanasida [0 .. Size-1] oralig'idan tashqaridagi indeksni tekshirish amalga oshiriladi .
Boshqa dastur kodlarida sinfdan foydalanishni namoyish etish
...


// CharArray sinfidan foydalanib CharArray
cA = new CharArray (15); // 15 belgidan iborat massiv
char c;


c = cA [0]; // c = 'A'
c = cA [3]; // c = 'D'
c = cA [10]; // c = 'K'
c = cA [14]; // c = 'O'
c = cA [15]; // c = 'A' -
c = cA doirasidan tashqariga kirishga urinish [30]; // c = 'A' - doiradan tashqariga kirishga urinish


cA [3] = 'Z' ;
c = cA [3]; // c = 'Z'


cA [30] = 'X' ; // ruxsat berilgan, lekin aksessuarlar to'plamida bloklangan {...}
c = cA [30]; // c = 'A'


...
3. Int qiymatini qaytaradigan bir o'lchovli indeksatorni e'lon qilish misoli

Misol, int qiymatini qaytaradigan bir o'lchovli indeksatorni o'z ichiga olgan sinfni amalga oshiradi . Indeksatorda indekslarning turi ham int .
// Indexer olgan sinf
darslarini IntArray
{
int [] qator; // qator


umumiy IntArray ( int hajmi)
{
//
Array massivi uchun xotira ajratish = new int [size];


// uchun qatorni bekor
qilish ( int i = 0; i Array [i] = 0;
}


//
public int indexer bu [ int index]
{
// accessors
get { return Array [index]; }
set {Array [index] = qiymat ; }
}
}
Boshqa dastur kodlarida IntArray sinfidan foydalanish
// IntArray sinfidan foydalaning
IntArray iA = yangi IntArray (100);
int i;
int d;


//
for indexer orqali massivni qiymatlar bilan to'ldirish (i = 0; i <100; i ++)
iA [i] = i * i + 1;


d = iA [3]; // d = 10
d = iA [25]; // d = 626


iA [25] = 15;
d = iA [25]; // d = 15
Bir indeks bo'lgan bir o'lchovli e'lon 4. misol char turiga amalga oshirilmoqda.

Indeksatorda indeksning turi tamsayı bo'lishi shart emas. Shuningdek, indeksning boshqa turini e'lon qilishingiz mumkin, masalan double , char . Ammo bu holda ichki massivdan foydalanganda indeks turini boshqa turdan ( double , char , ...) int turiga o'tkazish kerak bo'ladi .
Quyidagi misol indeksatori char raqami bo'lgan sinfda indeksatordan foydalanishni namoyish etadi . Ushbu misol berilgan qatorda 'A' ... 'Z' lotin alifbosidagi belgilar sonini hisoblashni amalga oshiradi .
// indeksator tarkibidagi indeks
CharIndex tipidagi char sinf bo'lgan sinf
{
int [] qator;
int hajmi;


ommaviy CharIndex ()
{
Hajmi = 26;
Array = new int [Size];


uchun ( int i = 0; i Array [i] = 0;
}


//
public int indeksatori bu [ char belgisi]
{
olish
{


agar ((belgi> = 'A' ) && (belgi <= 'Z' ))
Qaytish Array [( int ) (( int ) belgisi - ( int ) 'A' )];
qaytish 0;
}
o'rnatilgan
{
agar ((belgi> = 'A' ) && (belgi <= 'Z' ))
Array [( int ) belgisi- ( int ) 'A' ] = qiymat ;
}
}
}
Yuqoridagi koddan ko'rinib turibdiki, get va set accessors-da , Array indekslari int turiga o'tkaziladi . Biroq, dastur kodidan CharIndex sinfining ob'ektiga char tipidagi indeks orqali kirish mumkin .
Boshqa dastur kodlarida sinfdan foydalanish
// CHARINDEX
CHARINDEX sinfidan foydalaning cI = yangi CHARINDEX ();
string s = "PROGRAMMALARDA KO'RSATUVCHILARNI FOYDALANISH" ;
int d;
int i;
char c;


// .. "Z" belgilar "A" sonini hisoblash
uchun (i ++; i cI [s [i]] ++;


d = cI [ 'U' ]; // d = 1
d = cI [ 'A' ]; // d = 2
d = cI [ 'N' ]; // d = 4
d = cI [ 'I' ]; // d = 3
5. Ikki o'lchovli indeksatorni e'lon qilish misoli

Masalan, ikki o'lchovli juftlik qatorini amalga oshiradigan ikki o'lchovli indeksator e'lon qilinadi .
//
TwoDimIndexes ikki o'lchovli indeksator sinfini amalga oshiruvchi sinf
{
ikki baravar [,] A; //
int m, n elementlarning ichki massivi ; // massiv o'lchovi


// constructor
public TwoDimIndexes ( int _m, int _n)
{
m = _m;
n = _n;


A = yangi juftlik [m, n];


uchun ( int i = 0; i uchun ( int j = 0; j A [i, j] = 0;
}


// ikki o'lchovli indeksator
jamoatchilik buni ikki baravar oshiradi [ int i, int j]
{
get { return A [i, j]; }
belgilangan {A [i, j] = qiymat ; }
}
}
TwoDimIndexes sinfidan ba'zi kodlarda foydalanish
// TwoDimIndexes
sinfidan foydalaning TwoDimIndexes dI = yangi TwoDimIndexes (3, 5);
er-xotin x;


//
( int i = 0; i <3; i ++)
uchun ( int j = 0; j <5; j ++) uchun indeksator yordamida massiv hosil qilish
dI [i, j] = i * 2 + j;


x = dI [1, 3]; // x = 1 * 2 + 3 = 5
x = dI [2, 0]; // x = 4
6. Uch o'lchovli indeksatorni e'lon qilish misoli

Uch o'lchovli indeksatorni o'z ichiga olgan sinf e'lon qilindi
// uch o'lchovli indeksator
sinf ThreeDimIndexes deb e'lon qilingan sinf
{
juft [ ,, ] M; //
int x, y, z uch o'lchovli massiv ; // massiv o'lchovi


//
public ThreeDimIndexes konstruktori ( int _x, int _y, int _z)
{
x = _x;
y = _y;
z = _z;


// M
M = new double [3, 4, 5] massivi uchun xotirani ajratish ;
}


// uch o'lchovli indeksator
jamoatchilik buni ikki baravar oshiradi [ int i, int j, int k]
{
olish
{
bool fi, fj, fk;


// qator indekslarining haqiqiy chegaralarini tekshiring
fi = (i> = 0) && (i fj = (j> = 0) && (j fk = (k> = 0) && (k agar (fi && fj && fk)
return M [i, j, k];
aks holda
qaytarish 0.0;
}
o'rnatilgan
{
bool fi, fj, fk;


// qator indekslarining haqiqiy chegaralarini tekshiring
fi = (i> = 0) && (i fj = (j> = 0) && (j fk = (k> = 0) && (k agar (fi && fj && fk)
M [i, j, k] = qiymat ;
boshqa
M [i, j, k] = 0,0;
}
}
}
Boshqa dastur kodlarida sinfdan foydalanish
// sinfdan foydalaning ThreeDimIndexes ThreeDimIndexes
dI = yangi ThreeDimIndexes (3, 4, 5);
er-xotin x;


//
int i, j, k indeksatori yordamida massiv elementlari qiymatlarini shakllantirish ;


for (i = 0; i <3; i ++)
for (j = 0; j <4; j ++)
for (k = 0; k <5; k ++)
dI [i, j, k] = i * 2.5 + j * 2 + k;


x = dI [0, 1, 3]; // x = 0 * 2.5 + 1 * 2 + 3 = 5.0
x = dI [1, 3, 2]; // x = 1 * 2.5 + 3 * 2 + 2 = 10.5


7. Indeksatorlardan tayanch massivsiz foydalanish xususiyatlari qanday?

Indeksatordan foydalanish uchun sinfga ichki qator o'zgaruvchisini e'lon qilish shart emas. Albatta, ma'lumotlar ichki o'zgaruvchida (massivda) ham saqlanishi mumkin. Shu bilan birga, qator elementlari qiymatlari dasturiy shakllanishida, ya'ni ular biron bir naqsh yoki formulaga berilish holatlari mavjud. Bunday hollarda saqlash uchun qo'shimcha xotirani talab qiladigan ichki qatorni e'lon qilish shart emas.


8. Indeksatorni o'z ichiga olgan, lekin bazaviy qatorni o'z ichiga olmagan sinf deklaratsiyasiga misol. N-Fibonachchi sonining qiymatini hisoblash

CFibonacci klassi ketma-ket joylashgan joyiga qarab Fibonachchi raqamini hosil qiladigan indeksatorni e'lon qiladi. Raqamni aniqlash uchun sinfda GetNumber () yashirin ( xususiy ) qo'shimcha usuli qo'llaniladi . Sinf konstruktorni o'z ichiga olmaydi. Sinfdagi indeksatorda faqat bitta get accessor mavjud .


Sinfni amalga oshirish quyidagicha
// ichki
CFibonacci sinfidan foydalanmasdan indeksatorni o'z ichiga olgan sinf
{
// ichki usul
// Fibonachchi sonining qiymatini uning pozitsiya indeksiga ko'ra
hisoblaydi private int GetNumber ( int indeksi)
{
if (index <0) return -1;
int t = 0;
agar (indeks == 1) t = 1;
agar (indeks == 2) t = 1;
agar (indeks> 2)
{
int t1, t2;
int i;
t1 = t2 = 1;
i = 2;


while (i {
t = t1 + t2;
t1 = t2;
t2 = t;
i ++;
}
}
qaytish t;
}


//
public int indexer bu [ int index]
{
get { return GetNumber (indeks); }
}
}
Boshqa kodda CFibonacci sinfidan foydalanish
// ichki bazaviy
massivsiz indeksator yordamida CFibonacci cF = new CFibonacci ();
int d;


// Fibonachchi raqamini o'qing
d = cF [5]; // d = 5
d = cF [7]; // d = 13
d = cF [10]; // d = 55
9. Indeksatorning ortiqcha yuklanishi nima deyiladi?

Indeksatorning haddan tashqari yuklanishi - bu turli xil indeks turlariga ega bo'lgan bir nechta indeksatorlar sinfidagi (masalan, int , char , double ) amalga oshirish.
Umuman olganda, bunday sinfni amalga oshirish quyidagilarga o'xshaydi:
sinf sinf Ism
{
...


public return _ type this [ type1 indeks ]
{
// ...
}


public return_type this [ type2 index ]
{
// ...
}


...


public return_type this [ typeN index ]
{
// ...
}


...
}
Qaerda

  • ClassName - ortiqcha yuklangan indeksator e'lon qilingan sinf nomi;

  • return_type - indeksator elementining turi. Ushbu turdagi barcha ortiqcha yuklangan indeksatorlar uchun keng tarqalgan;

  • Type1 , TYPE2 , ..., typeN - nomidagi ko'rsatkichlar turlari indeksi .
10. Haddan tashqari yuklangan indeksatorlardan foydalanadigan sinf deklaratsiyasiga misol

Sinfda CDoubleArray haddan tashqari yuklangan indeksatordan foydalanishni namoyish etadi
// haddan tashqari yuklangan indeksator
sinfini o'z ichiga olgan sinf CDoubleArray
{
ikkilamchi [] A;
int uzunligi;


ommaviy CDoubleArray ( int _length)
{
uzunlik = _ uzunlik;
A = yangi juft [uzunlik];
for ( int i = 0; i A [i] = i * 2;
}


// haddan tashqari yuklangan indeksator
public this [ int index]
{
get { return A [index]; }
belgilangan {A [index] = qiymat ; }
}
public double this [ ikki martalik indeks]
{
get { return A [( int ) (index + 0.5)]; }
Majmui {A [( int ) (indeks + 0,5)] = qiymati ; }
}
}
Boshqa dasturlash kodida CDoubleArray sinfidan foydalanish
// haddan tashqari yuklangan indeksator yordamida
CDoubleArray dA = yangi CDoubleArray (10);
ikki baravar ;


d = dA [3]; // d = 6
d = dA [3.3]; // d = 6
d = dA [3.5]; // d = 8


dA [4.7] = 1100;
d = dA [5]; // d = 1100













Download 0.67 Mb.

Do'stlaringiz bilan baham:
1   ...   10   11   12   13   14   15   16   17   18




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