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 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish