Informatika asoslari



Download 1,53 Mb.
Sana16.04.2020
Hajmi1,53 Mb.
#45189
Bog'liq
12. Funksiya shabloni (function template)

  • Mavzu: Shablonlar. Funksiya va sinf shabloni
  • Reja:
  • Shablon nima?
  • Funksiya shablonlari (function template)
  • Funksiya shabloni xususiyatlari
  • Sinf shablonlari (class template)
  • Xulosa.
  • Ma’ruza 11

Ushbu darsda C++ dasturlash tilining asosiy hususiyatlaridan bo’lgan shablonlar bilan tanishamiz.

  • Ushbu darsda C++ dasturlash tilining asosiy hususiyatlaridan bo’lgan shablonlar bilan tanishamiz.
  • Shablonlar yordamida umumiy funksiyalar va umumiy classlar yaratish imkoniyati mavjud.
  • Umumiy funksiya va umumiy classlar har xil ma’lumot toifalaridan, ularni overload qilmasdan (ko’p kod yozmasdan) foydalanish imkoniyatini beradi. Ya’ni bunda biz har bir toifa uchun aloxida funksiya yozishimiz shart bo’lmaydi.
  • Shablonlar ikki xil bo’ladi:
    • Funksiya shabloni (function template)
    • Sinf shabloni (class template)

Umumiy funksiyalar ma’lum bir amallar to’plamini turli xil toifalar bilan ishlash imkonini beradi.

  • Umumiy funksiyalar ma’lum bir amallar to’plamini turli xil toifalar bilan ishlash imkonini beradi.
  • Umumiy funksiyalarga argumentlardan tashqari toifalar ham parametr sifatida beriladi. Ko’pchilik algoritmlar ma’lumot toifasidan qat’iy nazar bir xil vazifa bajaradi.
  • Masalan, massivni saralash yoki massivdan qidirish algoritmlari int va float toifalari uchun bir xil ishlaydi, agar biz bu holatda overload qilsak ikkita funksiya yaratishimiz kerak, agar shablonlardan foydalansak bitta umumiy funksiya yaratishimiz kifoya.

Funksiya overloadidan qanday foydalaniladi?

  • Funksiya overloadidan qanday foydalaniladi?
      • int add(int a, int b);
      • float add(float a, float b);
      • double add(double a, double b);
      • Demak ushbu uchta ta funksiyaning o’rniga bitta umumiy funksiya (funksiya shabloni) yaratishimiz mumkin.
  • Bu orqali biz funksiyaga turli tipdagi argumentlarni jo’natishimiz va kerakli natijani olishimiz mumkin.
    • T add(T a, T b);

Funksiya shabloni template kalit so’zidan foydalangan holda amalga oshiriladi.

  • Funksiya shabloni template kalit so’zidan foydalangan holda amalga oshiriladi.
  • Quyida funksiya shablonini yaratish formasi keltirilgan:
  • template TOIFA> qaytarish-tipi funk-nomi (arg-lar)
  • {
  • // funksiya tanasi
  • }

#include

  • #include
  • using namespace std;
  • // Funksiya shabloni e’lon qilinishi...
  • template void swapargs(X &a, X &b)
  • {
  • X temp;
  • temp = a;
  • a = b;
  • b = temp;
  • }

int main()

  • int main()
  • {
  • int i=10, j=20;
  • double x=10.1, y=23.3;
  • char a='x', b='z';
  • cout << "Original i, j: " << i << ' ' << j << '\n';
  • cout << "Original x, y: " << x << ' ' << y << '\n';
  • cout << "Original a, b: " << a << ' ' << b << '\n';
  • swapargs(i, j); // swap funksiyasi butun toifa uchun (int)
  • swapargs(x, y); // swap funksiyasi haqiqiy toifa uchun (float)
  • swapargs(a, b); // swap funksiyasi simvol toifa uchun (char)
  • cout << "Swapped i, j: " << i << ' ' << j << '\n';
  • cout << "Swapped x, y: " << x << ' ' << y << '\n';
  • cout << "Swapped a, b: " << a << ' ' << b << '\n';
  • return 0;
  • }

Quyidagi misolda swapargs( ) funksiyasi boshqacharoq ko’rinishda e’lon qilingan. Ya’ni shablon birinchi satrda funksiya esa alohida satrda joylashgan.

  • Quyidagi misolda swapargs( ) funksiyasi boshqacharoq ko’rinishda e’lon qilingan. Ya’ni shablon birinchi satrda funksiya esa alohida satrda joylashgan.
      • template
      • void swapargs(X &a, X &b)
      • {
      • X temp;
      • temp = a;
      • a = b;
      • b = temp;
      • }
  • Lekin bu ko’rinishda birinchi va ikkinchi satr o’rniga bironta kod yozilsa xatolik beradi

#include

  • #include
  • using namespace std;
  • template
  • void myfunc(type1 x, type2 y)
  • {
  • cout << x << ' ' << y << '\n';
  • }
  • int main()
  • {
  • myfunc(10, "I like C++");
  • myfunc(98.6, 19L);
  • return 0; }

template void swapargs(X &a, X &b)

  • template void swapargs(X &a, X &b)
  • {
  • X temp;
  • temp = a;
  • a = b;
  • b = temp;
  • cout << "swapargs funksiya shabloni chaqirildi.\n";
  • }
  • // Bunda swapargs() funksiyasi faqatgina int tipi uchun ishlaydi.
  • void swapargs(int &a, int &b)
  • {
  • int temp;
  • temp = a;
  • a = b;
  • b = temp;
  • cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
  • }

int main()

  • int main()
  • {
  • int i=10, j=20;
  • double x=10.1, y=23.3;
  • char a='x', b='z';
  • cout << "Original i, j: " << i << ' ' << j << '\n';
  • cout << "Original x, y: " << x << ' ' << y << '\n';
  • cout << "Original a, b: " << a << ' ' << b << '\n';
  • swapargs(i, j); // calls explicitly overloaded swapargs()
  • swapargs(x, y); // calls generic swapargs()
  • swapargs(a, b); // calls generic swapargs()
  • cout << "Swapped i, j: " << i << ' ' << j << '\n';
  • cout << "Swapped x, y: " << x << ' ' << y << '\n';
  • cout << "Swapped a, b: " << a << ' ' << b << '\n';
  • return 0;
  • }

// Use new-style specialization syntax.

  • // Use new-style specialization syntax.
  • template<> void swapargs(int &a, int &b)
  • {
  • int temp;
  • temp = a;
  • a = b;
  • b = temp;
  • cout << " int tipi uchun maxsus swapargs funksiyasi.\n";
  • }

// Oddiy funksiyalardek, funksiya shablonini ham overload qilish mumkin.

  • // Oddiy funksiyalardek, funksiya shablonini ham overload qilish mumkin.
  • #include
  • using namespace std;
  • // f() funksiya shablonining birinchi turi.
  • template void f(X a)
  • {
  • cout << "Inside f(X a)="<
  • }
  • // f() funksiya shablonining ikkinchi turi.
  • template void f(X a, Y b)
  • {
  • cout << "Inside f(X a, Yb)="<
  • }
  • int main()
  • {
  • f(10); // calls f(X)
  • f(10, 20); // calls f(X, Y)
  • return 0;
  • }

Sinf shablonini e’lon qilishning umumiy formasi:

  • Sinf shablonini e’lon qilishning umumiy formasi:
  • template TOIFA> class sinf_nomi{
  • ...
  • }
  • Yoki quyidagi ko’rinishda e’lon qilish mumkin
  • template TOIFA>
  • class sinf_nomi {
  • ...
  • }
  • Sinf shablonini ishlatish
  • sinf_nomi obyekt;

#include

  • #include
  • using namespace std;
  • template
  • class mypair {
  • T a, b;
  • public:
  • mypair (T first, T second)
  • {a=first; b=second;}
  • T getmax ();
  • };
  • template
  • T mypair::getmax ()
  • {
  • T retval;
  • retval = a>b? a : b;
  • return retval;
  • }
  • int main () {
  • mypair myobject (100, 75);
  • cout << myobject.getmax();
  • return 0;
  • }

#include

  • #include
  • using namespace std;
  • const int SIZE = 10;
  • // Create a generic stack class
  • template class stack {
  • StackType stck[SIZE]; // holds the stack
  • int tos; // index of top-of-stack
  • public:
  • stack() { tos = 0; } // initialize stack
  • void push(StackType ob); // push object on stack
  • StackType pop(); // pop object from stack
  • };

template void stack::push(StackType ob)

  • template void stack::push(StackType ob)
  • {
  • if(tos==SIZE) {
  • cout << "Stack is full.\n";
  • return;
  • }
  • stck[tos] = ob;
  • tos++;
  • }
  • // Pop an object.
  • template StackType stack::pop()
  • {
  • if(tos==0) {
  • cout << "Stack is empty.\n";
  • return 0; // return null on empty stack
  • }
  • tos--;
  • return stck[tos];
  • }

int main()

  • int main()
  • {
  • // Demonstrate character stacks.
  • stack s1, s2; // create two character stacks
  • int i;
  • s1.push('a'); s2.push('x');
  • s1.push('b'); s2.push('y');
  • s1.push('c'); s2.push('z');
  • for(i=0; i<3; i++) cout << "Pop s1: " << s1.pop() << "\n";
  • for(i=0; i<3; i++) cout << "Pop s2: " << s2.pop() << "\n";
  • // demonstrate double stacks
  • stack ds1, ds2; // create two double stacks
  • ds1.push(1.1); ds2.push(2.2);
  • ds1.push(3.3); ds2.push(4.4);
  • ds1.push(5.5); ds2.push(6.6);
  • for(i=0; i<3; i++) cout << "Pop ds1: " << ds1.pop() << "\n";
  • for(i=0; i<3; i++) cout << "Pop ds2: " << ds2.pop() << "\n";
  • return 0;
  • }

#include

  • #include
  • using namespace std;
  • template class myclass
  • {
  • Type1 i;
  • Type2 j;
  • public:
  • myclass(Type1 a, Type2 b) { i = a; j = b; }
  • void show() { cout << i << ' ' << j << '\n'; } };

int main()

  • int main()
  • {
  • myclass ob1(10, 0.23);
  • myclass ob2('X', "Templates add power.");
  • ob1.show(); // show int, double
  • ob2.show(); // show char, char *
  • return 0;
  • }

template<> konstruktori maxsusashtirilgan sinf shabloni uchun ishlatiladi

  • template<> konstruktori maxsusashtirilgan sinf shabloni uchun ishlatiladi
  • template class myclass {
  • T x;
  • public:
  • myclass(T a) {
  • cout << "Inside generic myclass\n";
  • x = a;
  • }
  • T getx() { return x; }
  • };
  • // int toifasi uchun maxsuslashtirilgan sinf shabloni.
  • template <> class myclass {
  • int x;
  • public:
  • myclass(int a) {
  • cout << "Inside myclass specialization\n";
  • x = a * a;
  • }
  • int getx() { return x; }
  • };

Herbert Shield “C++ The complete references – fourth edition” 2003. Part -2, Chapter – 18.

  • Herbert Shield “C++ The complete references – fourth edition” 2003. Part -2, Chapter – 18.
  • TutorialsPoint – simply easy learning programming: http://www.tutorialspoint.com/cplusplus/cpp_templates.htm
  • http://www.cprogramming.com/tutorial/templates.html
  • http://www.cplusplus.com/doc/tutorial/templates/
  • Funksiya shablonlari - turli hil tipdagi o’zgaruvchilar yoki parametrik o’zgaruvchilar bilan ishlashda qo’llaniladi
  • Sinf shablonlari esa – tur hil obyrktlar ustida amallar bajarish uchun ishlatiladi.
  • Obyektlar – o’zgaruvchi va o’zgarmaslarning dinamik strukturasidan tashkil topadi.

Download 1,53 Mb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2022
ma'muriyatiga murojaat qiling

    Bosh sahifa
davlat universiteti
ta’lim vazirligi
maxsus ta’lim
zbekiston respublikasi
axborot texnologiyalari
O’zbekiston respublikasi
guruh talabasi
nomidagi toshkent
o’rta maxsus
davlat pedagogika
texnologiyalari universiteti
toshkent axborot
xorazmiy nomidagi
Ўзбекистон республикаси
rivojlantirish vazirligi
pedagogika instituti
таълим вазирлиги
махсус таълим
haqida tushuncha
O'zbekiston respublikasi
tashkil etish
toshkent davlat
vazirligi muhammad
saqlash vazirligi
kommunikatsiyalarini rivojlantirish
respublikasi axborot
vazirligi toshkent
bilan ishlash
Toshkent davlat
uzbekistan coronavirus
sog'liqni saqlash
respublikasi sog'liqni
koronavirus covid
coronavirus covid
vazirligi koronavirus
risida sertifikat
qarshi emlanganlik
sertifikat ministry
covid vaccination
vaccination certificate
Ishdan maqsad
o’rta ta’lim
fanidan tayyorlagan
matematika fakulteti
haqida umumiy
fanidan mustaqil
moliya instituti
fanining predmeti
pedagogika universiteti
fanlar fakulteti
ta’limi vazirligi