Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

11-ameliy_paradigma_qq

.pdf
Скачиваний:
0
Добавлен:
18.01.2026
Размер:
258 Кб
Скачать

11-ámeliy jumıs. Metaprogrammalastırıwdıń tiykarǵı ámeliyatları

Jumıstıń maqseti: Metaprogrammalastırıw túsinigin ámeliyatta qollanıwdı úyreniw. C++ tilindegi shablonlar (Templates) hám makroslar (Macros) járdeminde kompilyaciya waqtında (Compile-time) kod generaciya etiw usılların ózlestiriw. Kodtıń qaytalanıwın (boilerplate) azaytıw, tiplerge ǵárezsiz (generic) algoritmler jazıw hám orınlanıw waqtındaǵı ónimlilikti arttırıw kónlikpelerin qáliplestiriw.

Teoriyalıq bólim:

Metaprogrammalastırıw – bul programma kodın basqa kodtı jaratıw yamasa basqarıw ushın qollanıw.

Tiykarǵı túsinikler:

1.Makroslar (Preprocessor): #define arqalı tekstlik almastırıwlar. Eń ápiwayı metaprogrammalastırıw túri.

2.Shablonlar (Templates): C++ tiliniń eń kúshli quralı. Olar tiplerdi parametr retinde qabıllaydı hám kompilyator hár bir tip ushın bólek kod jaratadı.

3.Template Metaprogramming (TMP): Shablonlar járdeminde kompilyaciya waqtında esaplawlar júrgiziw (mısalı, faktorialdı programma iske túspesten burın esaplaw).

ÁMELIY BÓLIM:

C++ tilinde makroslar hám shablonlar menen islesiwdi kórip shıǵamız.

1-mısal: Makroslar (C Preprocessor)

Másele: Kishi funkciyalar hám konstantalar ushın makros jazıw.

Kod:

#include <iostream> using namespace std;

//Makros: Sannıń kvadratın tabıw

//Qáwipsizlik ushın argumentlerdi qawsırmaǵa alıw kerek ((x)*(x))

#define SQUARE(x) ((x) * (x))

//Makros: Eki sannıń maksimumı

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {

int a = 5;

 

cout << "Kvadrat: " << SQUARE(a) << endl;

// 25

cout << "Maksimum: " << MAX(10, 20) << endl;

// 20

cout << "Kvadrat (a+1): " << SQUARE(a + 1) << endl; // ((5+1)*(5+1)) = 36 return 0;

}

Túsindirme: Makroslar tipke qaramaydı, biraq olar qáwipsiz emes (side effect bolıwı múmkin, mısalı SQUARE(i++) qáte beredi).

2-mısal: Funkciya Shablonları (Function Templates)

Másele: Hár qıylı tipler (int, double) ushın birdey almastırıw (swap) funkciyasın jazıw.

Kod:

#include <iostream> using namespace std;

// Shablon funkciya template <typename T> void mySwap(T &a, T &b) {

T temp = a; a = b;

b = temp;

}

int main() {

int x = 10, y = 20;

mySwap(x, y); // int ushın generaciya etiledi cout << "Int: " << x << " " << y << endl;

double d1 = 1.5, d2 = 4.8;

mySwap(d1, d2); // double ushın generaciya etiledi cout << "Double: " << d1 << " " << d2 << endl;

return 0;

}

Túsindirme: template <typename T> qatarı T dep atalatuǵın belgisiz tip bar ekenin bildiredi. Kompilyator qollanılıwǵa qaray T nı int yamasa double ǵa almastıradı.

3-mısal: Klass Shablonları (Class Templates)

Másele: Qálegen tiptegi eki maǵlıwmattı saqlaytuǵın "Pair" (Jup) klasın jaratıw.

Kod:

#include <iostream> using namespace std;

template <typename T1, typename T2> class Pair {

public:

T1 first;

T2 second;

Pair(T1 a, T2 b) { first = a; second = b;

}

void show() {

cout << "(" << first << ", " << second << ")" << endl;

}

};

int main() {

//<int, double> tipleri menen obyekt jaratıw

Pair<int, double> p1(1, 2.5); p1.show();

//<string, int> tipleri menen

Pair<string, int> p2("Hello", 100); p2.show();

return 0;

}

4-mısal: Kompilyaciya waqtındaǵı esaplaw (Factorial TMP)

Másele: Programma iske túspesten burın faktorialdı esaplaw (Rekursiv shablonlar).

Kod:

#include <iostream> using namespace std;

// Ulıwma shablon template <int N> struct Factorial {

// enum yamasa static const arqalı mánisti saqlaymız static const int value = N * Factorial<N - 1>::value;

};

// Baza jaǵdayı (Specialization) template <>

struct Factorial<0> {

static const int value = 1;

};

int main() {

//Bul mánis kompilyaciya waqtında esaplanıp, kodqa 120 sanı jazıladı.

//Runtime-da heshqanday esaplaw bolmaydı.

cout << "5! = " << Factorial<5>::value << endl; cout << "10! = " << Factorial<10>::value << endl;

return 0;

}

Túsindirme: Bul texnika (Template Metaprogramming) joqarı ónimlilik kerek bolǵanda qollanıladı.

5-mısal: Variadic Templates (Kóp parametrli shablonlar)

Másele: Qálegen sanlı argumentlerdi ekranda shıǵarıw (print).

Kod:

#include <iostream> using namespace std;

//Baza jaǵdayı (rekursiya toqtawı) void print() {

cout << endl;

}

//Rekursiv shablon

template <typename T, typename... Args> void print(T first, Args... args) {

cout << first << " ";

print(args...); // Qalǵan argumentler ushın funkciyanı qayta shaqırıw

}

int main() {

print(1, 2.5, "Sálem", 'A'); // Hár qıylı tipler hám sanı return 0;

}

ÁMELIY TAPSÍRMALAR

1-tapsırma: Minimum tabıwshı shablon.

template <typename T> T findMin(T a, T b) funkciyasın jazıń. Ol eki sannan kishisin qaytarsın.

Main-de int, double hám char (ASCII) tipleri menen tekserip kóriń.

2-tapsırma: Massiv klası (Generic Array).

MyArray<T> klasın jaratıń. Ishinde T data[10] massivi bolsın.

set(index, value) hám get(index) metodların jazıń.

Main-de MyArray<int> hám MyArray<string> jaratıp, elementlerdi jazıp hám oqıp kóriń.

3-tapsırma: Makros vs Funkciya.

Sannıń kubın tabıwshı CUBE(x) makrosın hám inline int cube(int x) funkciyasın jazıń.

Ekewinde de a++ (a=3) argumentin berip kóriń hám nátiyjelerdiń ayırmashılıǵın túsindiriń. (Makros a nı eki ret asırıwı múmkin).

4-tapsırma: Fibonachchi (TMP).

4-mısalǵa uqsap, kompilyaciya waqtında Fibonachchi sanın esaplawshı shablon strukturasın jazıń.

Fib<N>::value = Fib<N-1>::value + Fib<N-2>::value.

Baza jaǵdayları: Fib<0>=0, Fib<1>=1.

5-tapsırma: Akkumulyator (Variadic Template).

sum(args...) degen shablon funkciya jazıń. Ol qálegen sandaǵı sanlardı (int, double aralas) qabıllap, olardıń qosındısın qaytarsın.

Mısal: sum(1, 2.5, 3) -> 6.5.

Kórsetpe: Baza jaǵdayı 0 qaytarıwı kerek.

Соседние файлы в предмете Programmalastiriw paradigmalari