11-ameliy_paradigma_qq
.pdf
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.
