Massiv tushunchasi. Bir o’lchovli massivlar. Massiv elementlarini tahlil qilish



Yüklə 63,35 Kb.
tarix24.12.2023
ölçüsü63,35 Kb.
#191595
5-Mustaqil ish dasturlash


5-Mustaqil ish

  1. Massiv tushunchasi. Bir o’lchovli massivlar. Massiv elementlarini tahlil qilish.

  2. Sinflarni yaratishda operatorlarni qayta yuklash mexanizmidan unumli foydalanish.

  3. Shablon funksiyalar yaratish va ulardan foydalanish.

  4. Shablon sinflar yaratish va ulardan foydalanish

  5. Shablon funksiyalarda funksiyalarni qayta yuklash mexanizmi.

  6. Shablon funksiyalarda funksiyalarni qayta yuklash mexanizmi.

C# dasturlash tilida kompyuter xotirasiga bir o’zgaruvchi yordamida bir nechta qiymatlarda foydalanishga to’g’ri keladi. Bir o’zgaruvchi bilan bir nechta qiymat ustida amallar bajarish uchun berilgan ma’lumotlar bir turga mansub bo’lishi kerak. C# dasturlash tilida bir o’zgaruvchi yordamida bir nechta qiymatlardan foydalanish uchun massiv degan turdan foydalaniladi. Dasturlash tillarida ro’yxat yoki jadval ko’rinishidagi ma’lumotlarni massiv deb atashadi. Massiv so’zining ma’nosi o’lcham, o’lchov demakdir. Massivning barcha elementlari bitta turga mansub bo’lib, ular bitta nom bilan nomlanadi va bir-birlaridan nomerlari (indekslari) bilan farq qiladi.


Endi dasturdagi ma’lumot strukturalari bilan tanishishni boshlaymiz. Dasturda ikki asosiy tur ma’lumot strukturalari mavjuddir. Birinchisi statik, ikkinchisi dinamikdir. Statik deganimizda xotirada egallagan joyi o’zgarmas, dastur boshida beriladigan strukturalarni nazarda tutamiz. Statik massivlar elementlar soni oldindan ma’lum bo’lgan va initsializatsiyalangan (qiymat belgilangan) massivlar hisoblanadi. Dinamik ma’lumot tiplari dastur davomida o’z hajmini, egallagan xotirasini o’zgartirishi mumkin. Dinamik massivlar esa elementlari soni oldindan ma’lum bo’lishi va uni initsializatsiyalash (qiymat belgilash) shart emas. Statik massivlarning kamchiliki shundaki, agar ularning o’lchamini oldindan juda katta olinsa-yu, uning ko’p qismi keraksiz qolib ketsa, u holda xotira behuda sarflanishiga olib keladi. Shu muammoni hal qilish maqsadida massivlar C# tilida asosan dinamik tarzda e’lon qilinadi. Massivlar dasturlashda eng ko’p qo’laniladigan ma’lumot tiplaridir. Massivlar hotirada ketma-ket joylashgan, bir tipdagi o’zgaruvchilar guruhidir. Alohida bir o’zgaruvchini ko’rsatish uchun massiv nomi va kerakli o’zgaruvchi indeksini yoziladi.
Massivlar yagona o’zgaruvchi bilan kompyuter xotirasiga saqlanadi, uning elementlari ma’lum bir indekslar bilan tartiblab joylashtiriladi. Massivlar yagona nom bilan bir nechta qiymatni o’zida mujassamlashtiradi, bularga matematikadagi vektorlarni misol keltirish mumkin. Vektor ham yagona nom bilan saqlanib uning tarkibida bir nechta qiymatni o’zida mujassamlashadi. Vektorning ham elementlari bir turga mansub va tartiblangan bo’ladi.
Bir o’lchovli massivlar
Odatda massivlar zarurat, katta hajmdagi tartiblangan, lekin chekli elementlarga oid masalalarni hal etishda yuzaga keladi. Dastur ishlatilishi davomida massivlar aniq nomga ega bo’lishi va uning elementlari ma’lum bir turda bo’lishi kerak. Bir o’lchovli massivlar kompyuter xotirasiga quyidagi shaklda saqlanadi

Massiv tarkibida elementlar mavjud bo’ladi. Massivning eng ko’pi bilan ketishi mumkin bo’lgan elementlar soni uning o’lchamini bildiradi. Massivning elementi turgan o’rni uning indeksi deyiladi. Massivning elementiga uning indeksi orqali murojaat qilinadi. Massivning indeksi sifatida butun sonlar xizmat qiladi. Har bir massiv o’zining individual nomiga ega bo’lishi kerak, ya’ni bir xil nomdagi massivlar bo’lmaydi. Ularning nomi oldin e’lon qilingan oddiy o’zgaruvchi nomi bilan ustma-ust tushmasligi kerak.
Statik massivlarni e’lon qilishning umumiy ko’rinishi quyidagicha:
[]={boshlang’ich qiymatlar}
Bunda {boshlang’ich qiymatlar} albatta bo’lishi kerak. Misollar:
int []A={1,4,3,1};
string[] B = { “olma”, “gilos”, “anor”};
double[] C = { 0.005, 1.234, 12.5, 13.5, 10.6 };
Yuqoridagi massivlarda massivning o’lchami uning initsializatsiya qismida qatnashgan elementlar soni bilan aniqlanadi. C# tilida xuddi C++ da bo’lgani kabi element indeksi 0 dan boshlanadi. A[0] indeksli element 1 ga teng, B[1] indeksli element esa “gilos” ga teng va h.
Aytib o’tganimizdek, C# tilida massivlar xotiradan unumli foydalanish maqsadida massivlarni dinamik tarzda e’lon qilishga kelishib olingan. Dinamik tarzda massivni e’lon qilishning umumiy ko’rinishi quyidagicha:
[] =new [o’lcham]
Bu yerda new operatori ga mos ravishda xotiradan joy ajratadi. Dinamik massivlarni e’lon qilishga doir misollar:
n = Convert.ToInt32(Console.ReadLine());
int[] M1 = new int[10];
float[] M2 = new float[100];
double[] M3 = new double[n];
M1 va M2 nomli massivlarning elementlari uchun 10 va 100 ta joy ajratilgan. Ular ham dinamik massiv hisoblanadi. M3 massiv uchun xotiradan qancha joy ajratish foydalanuvchining o’ziga havola qilingan, ya’ni n o’zgaruvchisi klaviaturadan kiritiladi, bu o’zgaruvchi qiymati esa M3 massiv o’lchami sifatida qabul qilinadi. M3 massiv dinamik massivga yorqin misoldir.
Dinamik massiv o’lchami ham statik massiv kabi aniqlanishi lozim, faqat bunda u dastur ishlashi davomida anqlanishi bilan static massivdan farq qiladi.
Indekslar massiv elementlariga murojat qilish uchun ishlatiladi. Indeks massivdagi element sonini bildiradi .Massivdagi to’rtinchi elementga murojat qilish uchun biz 3 indeksidan foydalanishimiz kerak. Misol uchun :num[3]. Massiv elementlarining qiymatlarini olish va o’rnatish uchun indekslardan foydalanamiz.
int[] nums=new int [4];
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=5;
Console.ReadLine(nums[3]); //5
Va bizda faqat 4 ta element uchun belgilangan massiv mavjud bo’lgani uchun , masalan oltinchi elementni qo’llay olmaymiz nums[5]=5;. Agar biz buni qilishga harakat qilsak biz IndexOutOfRangeException-ni olamiz.
Statik massivlar elementlar oldindan aniqlanadi. Buning uchun sikl operatorlariga murojaat qilamiz. Masalan, quyidagi misolda dinamik massivga qiymat berish hamda uning elementlarini chop etish amallar ko’rsatilgan. Biz massiv elementlari bilan ishlashimiz uchun for sikl operatori kerak buladi. Bu haqida yetarlicha bilimga ega bo’lmasayiz quyidagi link orqali o’tsangiz Starter bulimida Suxrob Xayitmurodov yetarlicha malumot bergan. Agar for sikl operatori haqida malumotga ega bulsayiz davom etamiz.
using System;
internal class ArrayExample
{
private static void Main()
{
int[] A = new int[10];
int i;
for (i = 0; i < 10; i = i + 1)
A[i] = i;
for (i = 0; i < 10; i = i + 1)
Console.WriteLine(‘A[‘ + i + ’]: ’ + A[i]);
}
}
Bu dasturda A massivning elementlari sifatida i ning qiymatlari kelmoqda. Xuddi shunday massiv elementlarini klaviatura orqali ham kiritish mumkin. Buning uchun quyidagi kodni ko’raylik:
using System;
internal class ArrayExample
{
private static void Main()
{
int[] A = new int[10];
int i;
for (i = 0; i < 10; i = i + 1)
A[i] = Convert.ToInt32(Console.ReadLine());
for (i = 0; i < 10; i = i + 1)
Console.WriteLine(‘A[‘ + i + ’]: ’ + A[i]);
}
}
Massiv elementlari qiymatlaridan foydalanishga doir quyidagi sodda misolni ko’rib chiqaylik.
Men Shahbozga judayam qiziqarli matematik masala berdim. Masala sharti quyidagicha: Men unga 10 ta son aytaman ularning yig’indisini topib 10 ga bo’lishi kerak buladi. Keyin Shahboz menga shu kodni yozib berdi. Sizham bu kodni o’z kompyuteringizda tekshirib kuring.

using System;


internal class Average
{
private static void Main()
{
int[] A = new int[10];
int i;
double S = 0;
Console.WriteLine("Sonlarni kiriting");
for (i = 0; i < 10; i = i + 1)
A[i] = Convert.ToInt32(Console.ReadLine());
for (i = 0; i < 10; i++)
S += A[i];
S = S / 10;
Console.WriteLine(S);
}
}
Massivlar bilan ishlaganda uning o’lchami chegarasidan chiqib ketmaslik lozim. Agar bu holat yuz bersa C# kompilyatori IndexOutOfRangeException xatoligi haqida xabar beradi. Bu xatolikni siz ham sinab kurmoqchi bulsangiz quyidagi kodni kiritib , ishlatib kuring:
using System;
internal class ArrayErr
{
private static void Main()
{
int[] sample = new int[10];
int i;
// Chegaradan chiqish holati yuz bermoqda
for (i = 0; i < 100; i = i + 1)
sample[i] = i;
}
}
C # har qanday dasturlash tili singari, o'rnatilgan turlarda asosiy operatsiyalarni bajarish uchun ishlatiladigan tayyor leksemalar to`plamiga ega. Masalan, + operatsiyasini ikkita butun sonni qo`shishga uchun ishlatish mumkinligi ma'lum:
/ Butun sonlar bilan + operatsiyasi.
int a = 100;
int b = 240;
int c = a + b; // c endi 340 ga teng
Bu erda hech qanday yangilik yo'q, lekin siz bir xil operatsiyani C # o'rnatilgan ma'lumotlarning aksariyatiga qo'llash mumkin deb o'ylaganmisiz? Masalan, kodni quyidagicha ko'rib chiqing:
// satrlar bilan + operatsiyasi.
satr si = "Salom";
satr s2 = "dunyo!";
satr s3 = si + s2; // s3 endi "Salom dunyo!"
Binar operatorlarni qayta yuklash
namespace ConsoleApplication1
{
class MyArr
{
// Uch o`lchovli fazoda koordinatalar
public int x, y, z;
public MyArr(int x = 0, int y = 0, int z = 0)
{
this.x = x;
this.y = y;
this.z = z;
}
Funksiyalar va sinflar samarali dasturlash uchun kuchli va moslashuvchan vositalar bo'lsa-da, ular ba'zi hollarda C++ ning foydalaniladigan barcha parametrlarning turlarini belgilash talabi tufayli cheklangan. Masalan, ikkita sonning eng kattasini hisoblash uchun funksiya yozishimiz kerak deylik:
Agar biz butun sonlar bilan ishlasak, hamma narsa yaxshi. Ammo agar biz ikki tomonlama qiymatlar bilan ishlashimiz kerak bo'lsa-chi? Ehtimol, ikki turdagi bilan ishlash uchun max() funksiyasini ortiqcha yuklashga qaror qilasiz:
Endi bizda char, int, double va > operatorini haddan tashqari yuklasak, hatto sinflar bilan ishlaydigan bir xil funktsiyaning ikkita versiyasi mavjud! Biroq, C++ bizdan o'zgaruvchilarning turlarini ko'rsatishni talab qilganligi sababli, biz bir xil funktsiyaning bir nechta versiyasini yozishimiz kerak, bu erda faqat parametrlar turi o'zgaradi. Va bu, o'z navbatida, dasturchilar uchun bosh og'rig'i, chunki bunday kodni saqlash kuch va vaqt jihatidan oson emas. Va eng muhimi, bu samarali dasturlash tushunchalaridan birini buzadi - kodlarning takrorlanishini minimallashtirish. Har qanday turdagi parametrlar bilan ishlaydigan max() funksiyasining bitta versiyasini yozish yaxshi emasmi?
Bu mumkin. Shablonlar dunyosiga xush kelibsiz!
Agar lug‘atdagi “shablon” so‘zining ta’rifiga e’tibor qaratsangiz, biz quyidagilarni ko‘ramiz: “Shablon – shunga o‘xshash mahsulotlar tayyorlanadigan namunadir”. Misol uchun, shablon stencil - chizma / naqsh / belgi kesilgan ob'ekt (masalan, plastinka). Agar biz boshqa ob'ektga trafaret yopishtirib, bo'yoq purkasak, biz minimal kuch bilan bir xil naqshni olamiz, tez va eng muhimi, biz o'nlab bu naqshlarni turli rangda yasay olamiz! Bunday holda, bizga faqat bitta stencil kerak va biz rasmning rangini oldindan aniqlashimiz shart emas (stencilni ishlatishdan oldin).
C++ tilida funksiya shablonlari boshqa shunga o'xshash funksiyalarni yaratish uchun shablon bo'lib xizmat qiladigan funksiyalardir. Asosiy g'oya - ba'zi yoki barcha o'zgaruvchilarning aniq turini (turlarini) ko'rsatmasdan funktsiyalarni yaratish. Buning uchun har qanday ma'lumotlar turi o'rniga qo'llaniladigan shablon parametrining turini ko'rsatuvchi funktsiyani aniqlaymiz. Shablon parametr turiga ega funktsiyani yaratganimizdan so'ng, biz samarali tarzda "funktsiya trafaretini" yaratadi.
Funksiya shablonini chaqirganda, kompilyator funksiya uchun shablon sifatida "trafaret" dan foydalanadi, shablon parametri turini funktsiyaga uzatilgan o'zgaruvchilarning haqiqiy turi bilan almashtiradi! Shunday qilib, biz faqat bitta shablon yordamida funktsiyaning 50 ta "soyasini" yaratishimiz mumkin
Hozircha siz C++ da funksiya shablonlari qanday yaratilganiga qiziqayotgandirsiz. Bu unchalik qiyin emasligi ma'lum bo'ldi. max() funksiyasining butun son versiyasini yana bir bor ko'rib chiqing:
Bu erda biz ma'lumotlar turini uch marta aniqlaymiz: a, b parametrlarida va funktsiyaning qaytish turida. Bu funksiya uchun shablon yaratish uchun int turini funksiya shablon parametri turiga almashtirishimiz kerak. Bu holatda faqat bitta ma'lumot turi (int) ishlatilganligi sababli, biz shablon parametrlarining faqat bitta turini ko'rsatishimiz kerak.
Biz bu turni har qanday nomlashimiz mumkin, agar u zaxiralangan/kalit so'z bo'lmasa. C++ tilida bosh T harfi bilan shablon parametrlari turlariga murojaat qilish odatiy holdir (“Type” so‘zining qisqartmasi).
Mana bizning o'zgartirilgan max() funksiyamiz:
Lekin bu hammasi emas. Dastur ishlamaydi, chunki kompilyator T nima ekanligini bilmaydi!
Buni amalga oshirish uchun biz kompilyatorga ikkita narsani aytishimiz kerak:
Funktsiya shablonining ta'rifi.
T funksiya shablon parametrining turi ekanligini ko'rsatadi.
Biz buni bitta kod qatorida shablon deklaratsiyasini (aniqrog'i, shablon parametrlari deklaratsiyasini) bajarish orqali amalga oshirishimiz mumkin:
Keling, shablon parametrlari deklaratsiyasini batafsil ko'rib chiqaylik:
Birinchidan, biz shablon kalit so'zini yozamiz, bu esa kompilyatorga shablon parametrlarini keyingi e'lon qilishimizni aytadi.
Funktsiya shablonining parametrlari burchakli qavslarda ko'rsatilgan.
Typename va class kalit so'zlari shablon parametr turlarini yaratish uchun ishlatiladi. Funktsiya shablonlarini ishlatishning asosiy holatlarida tip nomi va sinf o'rtasida farq yo'q, shuning uchun siz ikkalasidan birini tanlashingiz mumkin. Agar siz class kalit so'zidan foydalansangiz, parametrlarning haqiqiy turi sinf bo'lishi shart emas (bu asosiy ma'lumotlar turining o'zgaruvchisi, ko'rsatgich yoki boshqa narsa bo'lishi mumkin).
Keyin shablon parametrining turini nomlaymiz (odatda T).
Agar bir nechta shablon parametrlari kerak bo'lsa, ular vergul bilan ajratiladi:
Agar bir nechta parametrlar mavjud bo'lsa, ular odatda T1, T2 yoki boshqa harflar deb ataladi: T, S.
Eslatma: T turiga o'tkazilgan funktsiya argumentining turi sinf bo'lishi mumkinligi va sinflar odatda qiymat bo'yicha o'tkazilishi tavsiya etilmaganligi sababli, bizning funktsiya shablonimiz parametrlari va qaytish qiymatini doimiy havolalar qilish yaxshiroqdir, masalan:
shablon
const T& max (const T& a, const T& b)
{ Qaytish (a > b) ? a : b; .}
Funktsiya shablonlaridan foydalanish
Funktsiya shablonlaridan foydalanish oddiy funktsiyalardan foydalanishga o'xshaydi:
E'tibor bering, max() funksiyasiga uchta qo'ng'iroq ham har xil turdagi parametrlarga ega! Biz max() funksiyasini uch xil turdagi parametrlar bilan chaqirayotganimiz sababli, kompilyator max() funksiyasining uch xil versiyasini yaratish uchun funksiya shablonidan foydalanadi:
int tipidagi parametrlarga ega versiya (max).
Double tipidagi parametrlarga ega versiya (max).
tartipidagi parametrlarga ega versiya (max).
O'tkazilayotgan qiymatlar turini (max ning qismi) aniq ko'rsatishning hojati yo'q, kompilyator buni o'zi aniqlaydi.
Funktsiya shablonlari ko'p vaqtni tejaydi, chunki biz shablonni faqat bir marta yozamiz va biz uni har xil turdagi ma'lumotlar bilan ishlatishimiz mumkin. Funktsiya shablonlarini yozishga odatlanganingizdan so'ng, oddiy funktsiyani yozish uchun ko'proq vaqt talab qilinmasligini bilib olasiz (muntazam funktsiyaning bitta versiyasi). Funktsiya shablonlari kodni keyinchalik saqlashni ancha osonlashtiradi va ular xavfsizroqdir, chunki kodni nusxalash orqali funktsiyani qo'lda ortiqcha yuklashingiz shart emas va faqat yangi ma'lumotlar turini qo'llab-quvvatlashingiz kerak bo'lganda ma'lumotlar turlarini o'zgartirishingiz shart emas.
Funktsiya shablonlarining bir nechta kamchiliklari bor va agar ular haqida gapirmasak, kechirib bo'lmaydi:
1. Birinchidan, ba'zi eski kompilyatorlar funksiya shablonlarini qo'llab-quvvatlamasligi mumkin yoki ular mumkin, lekin cheklovlar bilan. Biroq, bu endi avvalgidek muammo emas.
2. Ikkinchidan, funktsiya shablonlari ko'pincha aqldan ozgan xato xabarlarini ishlab chiqaradi, bu oddiy funktsiya xatolaridan ko'ra shifrlash qiyinroq.
3. Uchinchidan, funksiya shablonlari kompilyatsiya vaqtini va kod hajmini oshirishi mumkin, chunki bitta shablonni bir nechta fayllarda “amalga oshirish” va qayta kompilyatsiya qilish mumkin.
Funktsiya shablonlarining kuchi va moslashuvchanligi bilan solishtirganda, bu kamchiliklar juda kichikdir!
Shablonlar ba'zi parametrlarga (masalan, ma'lumotlar turlari, bufer o'lchamlari, standart qiymatlar) bog'lanmagan holda umumlashtirilgan algoritmlarni kodlash uchun mo'ljallangan C++ tili vositasidir.
C++ da funksiya va sinf shablonlarini yaratish mumkin.
Shablonlar parametrlangan sinflar va funksiyalarni yaratishga imkon beradi. Parametr har qanday turdagi yoki ruxsat etilgan turlardan birining qiymati bo'lishi mumkin (integer, enum, global kirish mumkin bo'lgan nomga ega har qanday ob'ektga ko'rsatgich, mos yozuvlar). Masalan, bizga qandaydir sinf kerak:
Bitta aniq maqsadda biz ushbu sinfdan foydalanishimiz mumkin. Ammo, to'satdan, maqsad biroz o'zgardi va boshqa sinf kerak. Endi bizga SomeArray massivining 30 ta elementi va SomeArray elementlarining haqiqiy turi SomeValue kerak. Keyin biz aniq turlardan mavhum bo'lishimiz va parametrlarga ega shablonlardan foydalanishimiz mumkin. Sintaksis: boshida, sinfni e'lon qilishdan oldin, biz shablonni, ya'ni shablonni e'lon qilamiz va burchakli qavslar ichida parametrlarni belgilaymiz. Bizning misolimizda:
Keyin birinchi holat uchun (20 ta elementdan iborat SomeValue va SomeArray butun soni bilan) biz yozamiz:
SomeClass < 20, int > SomeVariable;
ikkinchisi uchun:
SomeClass < 30, double > SomeVariable2;
Shablonlar kod bo'lagi uchun stenografiya taqdim etsa-da, ulardan foydalanish bajariladigan kodni qisqartirmaydi, chunki kompilyator har bir variant to'plami uchun funksiya yoki sinfning alohida nusxasini yaratadi. Natijada, umumiy kutubxonalar ichida kompilyatsiya qilingan kodni almashish imkoniyati yo'qoladi.
Shablon tavsifi sintaksisi
Funktsiya shabloni shablon kalit so'zidan boshlanadi, undan keyin burchakli qavslar ichidagi parametrlar ro'yxati keladi. Keyin funksiya deklaratsiyasi keladi:shablonbekor tartiblash ( T massivi [], int o'lchami ); // prototip: tartiblash shabloni e'lon qilingan, lekin aniqlanmagan
shablon

void sort( T array[], int size ) // deklaratsiya va ta'rif


{
Tt;
uchun (int i = 0; i < hajmi - 1; i++)
uchun (int j = o'lcham - 1; j > i; j--)
agar (massiv[j] 
{
t = massiv[j];
massiv[j] = massiv[j-1];
massiv[j-1] = t;
}
}
shablon< int BufferSize > // butun son parametri
char * o'qish ()
{
char *Bufer = yangi belgi[ BufferSize ];
/* maʼlumotlarni oʻqish */
qaytarish buferi;
}
Typename kalit so'zi nisbatan yangi, shuning uchun standart[1] typename o'rniga sinfdan foydalanishga imkon beradi:
shablon
T o'rniga har qanday boshqa identifikator qabul qilinadi.
Foydalanish misoli
Eng oddiy misol - minimal ikki miqdorni aniqlash.
Agar a b dan kichik bo'lsa, a, aks holda b ni qaytaring
Shablonlar bo'lmasa, dasturchi foydalanilgan har bir ma'lumot turi uchun alohida funktsiyalarni yozishi kerak. Garchi ko'pgina dasturlash tillari elementar turlar (masalan, butun sonlar va haqiqiy sonlar) uchun o'rnatilgan minimal funktsiyani aniqlasa ham, bunday funktsiya murakkab (masalan, "vaqt" yoki "string") va juda murakkab ("" uchun" kerak bo'lishi mumkin. o'yinchi" onlayn o'yinda) ob'ektlar .
template< typename T >
T min( T a, T b )
{
return a < b ? a : b;
}
Ushbu funktsiyani chaqirish uchun siz shunchaki uning nomidan foydalanishingiz mumkin:
min( 1, 2 );
min( 'a', 'b' );
min( string( "abc" ), string( "cde" ) );
Shablon funksiyasini chaqirish
Umuman olganda, shablon funksiyasini chaqirish uchun siz barcha shablon parametrlari uchun qiymatlarni kiritishingiz kerak. Buni amalga oshirish uchun shablon nomidan keyin burchakli qavslardagi qiymatlar ro'yxati ko'rsatiladi:

int i[] = { 5, 4, 3, 2, 1 };


sort(i, 5);
char c[] = "бвгда";
sort( c, strlen( c ) );
sort< int >(c, 5); // ошибка: у sort параметр int[], а не char[]
char *ReadString = read<20>();
delete[] ReadString;
ReadString = read<30>();
Har bir variant to'plami uchun kompilyator funksiyaning yangi nusxasini yaratadi. Yangi namuna yaratish jarayoni shablonni yaratish deb ataladi.
Yuqoridagi misolda kompilyator tartiblash funksiyasi shablonining ikkita ixtisoslashuvini (char va int turlari uchun) va ikkita o'qish shablonining ixtisoslashuvini (BufferSize 20 va 30 qiymatlari uchun) yaratdi. Ikkinchisi behuda bo'lishi mumkin, chunki parametrning har bir mumkin bo'lgan qiymati uchun kompilyator faqat bitta konstanta bilan farq qiladigan ko'proq va ko'proq yangi funktsiyalar namunalarini yaratadi.
Parametr qiymatlarini chiqarish
Ba'zi hollarda kompilyator funktsiya argumentidan funksiya shablon parametrining qiymatini xulosa qilishi (mantiqiy aniqlashi) mumkin. Masalan, yuqorida tavsiflangan tartiblash funksiyasini chaqirganda, shablon parametrini ko'rsatish shart emas (agar u massiv argumentining element turiga mos kelsa):
int i[5] = { 5, 4, 3, 2, 1};
tartiblash (i, 5); // qo'ng'iroqlarni tartiblash
char c[] = "bvgda";
sort( c, strlen( c ) ); //
Olib tashlash yanada murakkab holatlarda ham mumkin.

Xulosa
Shablonlar parametrlangan sinflar va funksiyalarni yaratishga imkon beradi. Parametr har qanday turdagi yoki ruxsat etilgan turlardan birining qiymati bo'lishi mumkin (integer, enum, global kirish mumkin bo'lgan nomga ega har qanday ob'ektga ko'rsatgich, mos yozuvlar). Masalan, bizga qandaydir sinf kerak:
Bitta aniq maqsadda biz ushbu sinfdan foydalanishimiz mumkin. Ammo, to'satdan, maqsad biroz o'zgardi va boshqa sinf kerak. Endi bizga SomeArray massivining 30 ta elementi va SomeArray elementlarining haqiqiy turi SomeValue kerak. Keyin biz aniq turlardan mavhum bo'lishimiz va parametrlarga ega shablonlardan foydalanishimiz mumkin. Sintaksis: boshida, sinfni e'lon qilishdan oldin, biz shablonni, ya'ni shablonni e'lon qilamiz va burchakli qavslar ichida parametrlarni belgilaymiz. Bizning misolimizda:
Keyin birinchi holat uchun (20 ta elementdan iborat SomeValue va SomeArray butun soni bilan) biz yozamiz:
SomeClass < 20, int > SomeVariable;
ikkinchisi uchun:
SomeClass < 30, double > SomeVariable2;
Shablonlar kod bo'lagi uchun stenografiya taqdim etsa-da, ulardan foydalanish bajariladigan kodni qisqartirmaydi, chunki kompilyator har bir variant to'plami uchun funksiya yoki sinfning alohida nusxasini yaratadi. Natijada, umumiy kutubxonalar ichida kompilyatsiya qilingan kodni almashish imkoniyati yo'qoladi.


Internet resurslar.
1. http://www.stroustrup.com/4th.html
2. http://www.cplusplus.com/
3. http://acm.tuit.uz/- дастурий ечим тўғрилигини автоматик тестловчи тизим.
4. http://acm.tuit.uz/forum/
5. http://acm.timus.ru/ – дастурларни тестловчи тизим.
6. http://codeforces.com/ - дастурий ечим тўғрилигини автоматик тестловчи тизим

Yüklə 63,35 Kb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin