logo

C++ da shablonlar

Загружено в:

12.08.2023

Скачано:

0

Размер:

87.09375 KB
C++ da shablonlar  mavzusida tayyorlagan
Reja: 
1. Kirish
2. Umumiy shablonlar haqida .
3. Sinf shablon strukturasi ( misollar ).
4. Ko’p parametrli sinf shablonlari ( misollar ).
5. Xulosa Kirish
Shablon - bu C++ dasturlash xususiyati bo'lib, u umumiy turlar bilan 
funksiya va sinf operatsiyalarini amalga oshirishga imkon beradi, bu har bir tur 
uchun butun kod bloklarini qayta yozmasdan turli xil ma'lumotlar turlari bilan 
ishlash imkonini beradi.
Shablonlar C++ tilidagi qimmatli yordamchi dastur hisoblanadi, ayniqsa 
operatorning haddan tashqari yuklanishi va bir nechta merosxo'rlik bilan 
foydalanilganda. Shablonlar turli xil ma'lumotlar turlarini bitta kod to'plamiga 
kodlash bilan bog'liq harakatlarni kamaytiradi va disk raskadrovka harakatlarini 
kamaytiradi Umumiy shablonlar haqida :
Shablon   C++   tilida   oddiy,   ammo   juda   kuchli   vositadir.   Oddiy   g'oya   ma'lumotlar
turini parametr sifatida o'tkazishdir, shunda biz turli xil ma'lumotlar turlari uchun
bir   xil   kodni   yozishimiz   shart   emas.   Misol   uchun,   dasturiy   ta'minot   kompaniyasi
har xil ma'lumotlar turlari uchun sort() ni talab qilishi mumkin. Bir nechta kodlarni
yozish va saqlash o'rniga biz bitta sort() yozishimiz va ma'lumotlar turini parametr
sifatida o'tkazishimiz mumkin.
C++   shablonlarni   qo'llab-quvvatlash   uchun   ikkita   yangi   kalit   so'zni   qo'shadi:
"shablon"   va   "typename".   Ikkinchi   kalit   so'z   har   doim   "sinf"   kalit   so'zi   bilan
almashtirilishi mumkin.
Shablonlar qanday ishlaydi?
Shablonlar   kompilyator   vaqtida   kengaytiriladi.   Bu   makrolarga   o'xshaydi.   Farqi
shundaki,   kompilyator   shablonni   kengaytirishdan   oldin   turini   tekshiradi.   G'oya
oddiy, manba kodi faqat funksiya/sinfni o'z ichiga oladi, lekin tuzilgan kod bir xil
funktsiya/sinfning bir nechta nusxasini o'z ichiga olishi mumkin.
Shablonlar   C++   tilining   kuchli   xususiyatlari   bo'lib,   umumiy   dasturlarni   yozish
imkonini beradi. Shablonlarni amalga oshirishning ikki yo'li mavjud:
1)Funktsiya shablonlar.
2)Sinf shablonlar.
Funktsiya   shablonlariga   o'xshab,   biz   turli   xil   ma'lumotlar   turlari   bilan   ishlash
uchun bitta sinf yaratish uchun sinf shablonlaridan foydalanishimiz mumkin. Sinf shablonlari   foydali   bo'ladi,   chunki   ular   bizning   kodimizni   qisqartirishi   va
boshqarilishi mumkin.
Sinf shabloni strukturasi: 
Sinf shabloni template kalit so'zidan boshlanadi, undan keyin <> ichidagi shablon
parametr(lar)idan keyin ma’lum bir nomli sinf yaratiladi.
template <class X>
class SnifNom {
  private:
    T var;
//Kodning qolgan qismlari
  public:
    X funktsiyaNom(X arg);
     //Kodning qolgan qismlari
};
Bu yerda X, shablon argumentidir.
Sinf   tanasi   ichida   a'zo   o'zgaruvchisi(var)   var   va   a'zo   funktsiyasi   funktsiyaNom()
ikkalasi ham T turiga kiradi.
Sinf shabloni ob'ektini yaratish
Biz   sinf   shablonini   e'lon   qilganimizdan   va   aniqlaganimizdan   so'ng,   biz   uning
ob'ektlarini   boshqa   sinflar   yoki   funktsiyalarda   (masalan,   main()   funksiyasi)
quyidagi sintaksis bilan yaratishimiz mumkin SinfNom <malumot turi> classObject;
misol uchun
SinfNom <int> classObject;
SinfNom <float> classObject;
SinfNom <string> classObject;
1-misol:  C++ da sinf shabloni
//Sinf shablonlaridan foydalanishni ko'rsatish uchun C++ dasturi
#include <iostream>
using namespace std;
// Sinf shabloni
template <class M>
class Number
{
private:
    // M turidagi num o'zgaruvchisi
    M num;
public:     Number(M n){        // konstruktor
        num = n;
    }
    M getNum() {
        return num;
    }
};
int main()
{
    // int turi bilan obyekt yaratildi
    Number<int> numberInt(6);
    // double turi bilan obyekt yaratildi
    Number<double> numberDouble(10.5);
    cout << "int turidagi son = " << numberInt.getNum() << endl;
       cout   << "double turidagi son  = "  <<  numberDouble.getNum() <<
endl;
    return 0;
}
Dastur natijasi:  2-misol: Sinf shablonlaridan foydalangan holda oddiy kalkulyator.
Ushbu dastur ikkita o'zgaruvchining soni 1 va 2 ni qo'shish, ayirish, ko'paytirish va
bo'lish   uchun   sinf   shablonidan   foydalanadi.   O'zgaruvchilar   har   qanday   turdagi
bo'lishi   mumkin,   ammo   biz   bu   misolda   faqat   int   va   float   turlaridan
foydalanganmiz.
#include <iostream>
using namespace std;
template <class T>
class Calculator {
private:
T num1, num2;
public:
Calculator(T n1, T n2) {
num1 = n1;
num2 = n2; }
void displayResult() {
cout << "Sonlar : " << num1 << " va " << num2 << "." << endl;
cout << num1 << " + " << num2 << " = " << add() << endl;
cout << num1 << " - " << num2 << " = " << subtract() << endl;
cout << num1 << " * " << num2 << " = " << multiply() << endl;
cout << num1 << " / " << num2 << " = " << divide() << endl;
}
T add(){
return num1 + num2;
}
T subtract(){
return num1 - num2;
}
T multiply(){
return num1 * num2;
}
T divide(){
return num1 / num2; }
};
int main() {
Calculator<int> intCalc(3, 4);
Calculator<float> floatCalc(2.5, 3);
cout << "int tipidagi natijalar:" << endl;
intCalc.displayResult();
cout << endl
<< "float tipidagi natijalar:" << endl;
floatCalc.displayResult();
return 0;
}
Dastur natijasi:  Yuqoridagi dasturda biz Kalkulyator sinf shablonini e'lon qildik.
Sinf    T tipidagi ikkita xususiy a'zoni  o'z ichiga oladi: num1 & num2 va a'zolarni
ishga tushirish uchun konstruktor.
Shuningdek,   bizda   add(),   subtract(),   multiply()   va   divide()   funksiyalari   ham   bor,
ular   qaytaruvchi   T   turiga   ega.   Shuningdek,   bizda   boshqa   funksiyalar   natijalarini
chop etuvchi displeyResult() void funksiyasi ham bor.
main()   da   biz   Kalkulyatorning   ikkita   ob'ektini   yaratdik:   biri   int   ma'lumotlar   turi
uchun, ikkinchisi esa float ma'lumotlar turi uchun.
Calculator<int> intCalc(3, 4);
     Calculator<float> floatCalc(2.5, 3);
Bu   kompilyatorni   kompilyatsiya   paytida   tegishli   ma'lumotlar   turlari   uchun   ikkita
sinf ta'rifini yaratishni taklif qiladi.
Ko'p parametrli C++ sinfi shablonlari
C++   da   biz   bir   nechta   shablon   parametrlaridan   foydalanishimiz   va   hatto   ushbu
parametrlar uchun standart argumentlardan foydalanishimiz mumkin. Masalan:
template <class T, class U, class V = int>
class ClassName {
  private:
    T member1;
    U member2;     V member3;
     // kodning qandaydir qismi
  public:
   // kodnign qandaydir qismi
};
3-misol: C++ da ko’p parametrli shablonlar
#include <iostream>
#include <string>
using namespace std;
// Ko'p paramaetrli sinf shablonlaridan foydalanildi
// V = string kod sinfiga e'tibor bering. Bu shuni anglatadiki, V standart
turi string bo'lgan standart parametrdir.
template <class T, class U, class V = string>
class ClassTemplate {
   private:
    T var1;
    U var2;
    V var3;
   public:
    ClassTemplate(T v1, U v2, V v3){    // constructor         var1 = v1;
        var2 = v2;
        var3 = v3;
    }
    void printVar() {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};
int main() {
    // int, double va char tipidagi obyektlar yaratildi
    ClassTemplate<int, double> obj1(10, 7.7, "Muhriddin");
    cout << "obj1 qiymatlari: " << endl;
    obj1.printVar();
    // int, double va char tipidagi obyektlar yaratildi
    ClassTemplate<double, string, bool> obj2(9.12, "Temurbek", false);
    cout << "\nobj2 qiymatlari: " << endl;
    obj2.printVar();
    return 0;
} Ushbu dasturda biz ClassTemplate nomli uchta parametrli sinf shablonini yaratdik,
ulardan biri standart parametrdir.
Quyida   C++   da   shablonlardan   foydalangan   holda   Bubble   Sort   dasturini
amalga oshirish dasturi keltirilgan:
//C++ da shablon funksiyasidan foydalangan holda Bubble Sort ni yozish
#include <iostream>
using namespace std;
// Bubble Sortni amalga oshirish uchun shablon funksiyasi
//   Biz   buni   qo'llab-quvvatlaydigan   har   qanday   ma'lumot   turi   uchun
ishlatishimiz mumkin
// bu uchun almashtirish va taqqoslash operatori ishlaydi
template <class T> void bubbleSort(T a[], int n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = n - 1; i < j; j--)             if (a[j] < a[j - 1])
                swap(a[j], a[j - 1]);
}
// kodni yuritish
int main()
{
    int a[5] = { 10, 50, 30, 40, 20 };
    int n = sizeof(a) / sizeof(a[0]);
    // shablon funksiyasini chaqiradi
    bubbleSort<int>(a, n);
    cout << " Saralangan massiv: ";
    for (int i = 0; i < n; i++)
        cout << a[i] << ", ";
    cout << endl;
    return 0;
} Funktsiyani haddan tashqari yuklash va shablonlar o'rtasidagi far q nima?
Funktsiyani   haddan   tashqari   yuklash   ham,   shablon   ham   OOP   ning   polimorfizm
xususiyatlariga   misoldir.   Funktsiyani   haddan   tashqari   yuklash   bir   nechta
funktsiyalar juda o'xshash (bir xil bo'lmagan) operatsiyalarni bajarganda ishlatiladi,
shablonlar bir nechta funktsiyalar bir xil operatsiyalarni bajarganda ishlatiladi.
Shablon sinfida/funktsiyasida statik a'zo bo'lsa nima bo'ladi?
Shablonning har bir nusxasi o'zining statik o'zgaruvchisini o'z ichiga oladi. 
Shablon ixtisosligi  nima?
Shablon ixtisoslashuvi bizga ma'lum bir ma'lumot turi uchun turli xil kodlarga ega
bo'lish imkonini beradi.
Shablonlarga turi bo'lmagan parametrlarni o'tkaza  olamizmi? Biz   turi   bo'lmagan   argumentlarni   shablonlarga   o'tkazishimiz   mumkin.   Turi
bo'lmagan   parametrlar   asosan   shablonning   ma'lum   bir   namunasi   uchun   maksimal
yoki   min   qiymatlarni   yoki   boshqa   har   qanday   doimiy   qiymatni   belgilash   uchun
ishlatiladi. Turi bo'lmagan parametrlarga e'tibor berish kerak bo'lgan muhim narsa
shundaki,   ular   const   bo'lishi   kerak.   Kompilyator   kompilyatsiya   vaqtida   turi
bo'lmagan   parametrlarning   qiymatini   bilishi   kerak.   Chunki   kompilyator
kompilyatsiya vaqtida belgilangan turi bo'lmagan qiymat uchun funktsiyalar/sinflar
yaratishi kerak Xulosa
Xulosa shundan iboratki ushbu mustaqil ishda C++ da shablonlar mavzusi yoritib 
berildi. Agar reja bo’yicha xulosa qiladigan bo’lsak, tabiyki rejaning birinchi qismi
kirish qismidan iborat. Rejaning ikkinch qismida esa Umumiy C++ dagi shablonlar
haqida qisqacha ma’lumot berib o’tildi. Bundan kiyin esa sinf shabloni haqida 
ma’lumotlar berildi va uning strukturasi ko’rsatildi. Bu jarayon davomida sinf 
shablonlariga misol qilib ikkita dastur kodi yozildi va natija olindi. Kiyin reja 
bo’yicha uchinchi qism ya’ni Ko’p parametrli sinf shablonlari haqida ma’lumot va 
misollari bilan berildi va ushbu mustaqil ish davomida Bubble Sort dasturi kodi 
shablonlardan foydalanilgan holda yozildi va ish oxirida  funktsiyani haddan 
tashqari yuklash va shablonlar o'rtasidagi farq, shablon ixtisosligi, shablonlarga 
turi bo'lmagan parametrlarni o'tkazish haqida ma’lumot berib o’tildi. Foydalanilgan adabiyotlar va saytlar:
https://www.w3schools.com/
https://www.geeksforgeeks.org/templates-cpp/
https://stackoverflow.com/
https://www.freepik.com/psd/programming-language

C++ da shablonlar mavzusida tayyorlagan Reja: 1. Kirish 2. Umumiy shablonlar haqida . 3. Sinf shablon strukturasi ( misollar ). 4. Ko’p parametrli sinf shablonlari ( misollar ). 5. Xulosa

Kirish Shablon - bu C++ dasturlash xususiyati bo'lib, u umumiy turlar bilan funksiya va sinf operatsiyalarini amalga oshirishga imkon beradi, bu har bir tur uchun butun kod bloklarini qayta yozmasdan turli xil ma'lumotlar turlari bilan ishlash imkonini beradi. Shablonlar C++ tilidagi qimmatli yordamchi dastur hisoblanadi, ayniqsa operatorning haddan tashqari yuklanishi va bir nechta merosxo'rlik bilan foydalanilganda. Shablonlar turli xil ma'lumotlar turlarini bitta kod to'plamiga kodlash bilan bog'liq harakatlarni kamaytiradi va disk raskadrovka harakatlarini kamaytiradi

Umumiy shablonlar haqida : Shablon C++ tilida oddiy, ammo juda kuchli vositadir. Oddiy g'oya ma'lumotlar turini parametr sifatida o'tkazishdir, shunda biz turli xil ma'lumotlar turlari uchun bir xil kodni yozishimiz shart emas. Misol uchun, dasturiy ta'minot kompaniyasi har xil ma'lumotlar turlari uchun sort() ni talab qilishi mumkin. Bir nechta kodlarni yozish va saqlash o'rniga biz bitta sort() yozishimiz va ma'lumotlar turini parametr sifatida o'tkazishimiz mumkin. C++ shablonlarni qo'llab-quvvatlash uchun ikkita yangi kalit so'zni qo'shadi: "shablon" va "typename". Ikkinchi kalit so'z har doim "sinf" kalit so'zi bilan almashtirilishi mumkin. Shablonlar qanday ishlaydi? Shablonlar kompilyator vaqtida kengaytiriladi. Bu makrolarga o'xshaydi. Farqi shundaki, kompilyator shablonni kengaytirishdan oldin turini tekshiradi. G'oya oddiy, manba kodi faqat funksiya/sinfni o'z ichiga oladi, lekin tuzilgan kod bir xil funktsiya/sinfning bir nechta nusxasini o'z ichiga olishi mumkin. Shablonlar C++ tilining kuchli xususiyatlari bo'lib, umumiy dasturlarni yozish imkonini beradi. Shablonlarni amalga oshirishning ikki yo'li mavjud: 1)Funktsiya shablonlar. 2)Sinf shablonlar. Funktsiya shablonlariga o'xshab, biz turli xil ma'lumotlar turlari bilan ishlash uchun bitta sinf yaratish uchun sinf shablonlaridan foydalanishimiz mumkin. Sinf

shablonlari foydali bo'ladi, chunki ular bizning kodimizni qisqartirishi va boshqarilishi mumkin. Sinf shabloni strukturasi: Sinf shabloni template kalit so'zidan boshlanadi, undan keyin <> ichidagi shablon parametr(lar)idan keyin ma’lum bir nomli sinf yaratiladi. template <class X> class SnifNom { private: T var; //Kodning qolgan qismlari public: X funktsiyaNom(X arg); //Kodning qolgan qismlari }; Bu yerda X, shablon argumentidir. Sinf tanasi ichida a'zo o'zgaruvchisi(var) var va a'zo funktsiyasi funktsiyaNom() ikkalasi ham T turiga kiradi. Sinf shabloni ob'ektini yaratish Biz sinf shablonini e'lon qilganimizdan va aniqlaganimizdan so'ng, biz uning ob'ektlarini boshqa sinflar yoki funktsiyalarda (masalan, main() funksiyasi) quyidagi sintaksis bilan yaratishimiz mumkin

SinfNom <malumot turi> classObject; misol uchun SinfNom <int> classObject; SinfNom <float> classObject; SinfNom <string> classObject; 1-misol: C++ da sinf shabloni //Sinf shablonlaridan foydalanishni ko'rsatish uchun C++ dasturi #include <iostream> using namespace std; // Sinf shabloni template <class M> class Number { private: // M turidagi num o'zgaruvchisi M num; public: