8-ameliy_paradigma_qq
.pdf
8-ámeliy jumıs. Funkcional programmalastırıwda máselelerdi sheshiw
Jumıstıń maqseti: Funkcional programmalastırıw (Functional Programming - FP) paradigmasınıń tiykarǵı principlerin ózlestiriw. Taza funkciyalar (Pure Functions), Joqarı tártipli funkciyalar (Higher-Order Functions), Lambda ańlatpaları hám Rekursiyanı ámeliyatta qollanıwdı úyreniw. C++ tilindegi funkcional imkaniyatlardan (std::function, lambda, algorithm kitapxanası) paydalanıp, kodtıń ıqshamlıǵı hám deklarativligin arttırıw.
Teoriyalıq bólim:
Funkcional programmalastırıw – bul esaplawlardı matematikalıq funkciyalardıń mánislerin esaplaw retinde qaraytuǵın paradigma.
Tiykarǵı túsinikler:
1.Taza funkciyalar (Pure Functions): Nátiyjesi tek argumentlerine ǵárezli bolǵan hám sırtqı tásirge (side effect) iye bolmaǵan funkciyalar.
2.Immutability (Ózgermeytuǵınlıq): Maǵlıwmatlar jaratılǵannan keyin ózgertilmeydi. Jańa mánis kerek bolsa, jańa obyekt jaratıladı.
3.Birinshi dárejeli funkciyalar: Funkciyalardı ózgeriwshige saqlawǵa, argument retinde beriwge hám nátiyje retinde qaytarıwǵa boladı.
4.Joqarı tártipli funkciyalar (HOF): Basqa funkciyanı parametr retinde alatuǵın yamasa funkciya qaytaratuǵın funkciyalar (mısalı: map, filter, reduce).
5.Lambda ańlatpaları: Atamasız (anonim) funkciyalar, kodtıń ishinde qısqa operaciyalar ushın qollanıladı.
ÁMELIY BÓLIM:
C++ (Modern C++11/14/17) tilinde funkcional stildegi kodlardı kórip shıǵamız.
1-mısal: Lambda ańlatpaları (Anonim funkciyalar)
Másele: Ápiwayı arifmetikalıq ámellerdi lambda arqalı orınlaw.
Kod:
#include <iostream> #include <vector>
#include <algorithm> // for_each using namespace std;
int main() {
//Lambda funkciya: [] (int a, int b) { return a + b; }
//[] - capture clause (sırtqı ózgeriwshilerdi uslaw) auto qosiw = [](int a, int b) {
return a + b;
};
cout << "5 + 3 = " << qosiw(5, 3) << endl;
// Lambda nı tikkeley parametr retinde beriw vector<int> sanlar = {1, 2, 3, 4, 5};
cout << "Massiv elementleri: ";
// for_each - HOF (Joqarı tártipli funkciya) for_each(sanlar.begin(), sanlar.end(), [](int n) {
cout << n << " ";
});
cout << endl;
return 0;
}
2-mısal: Joqarı tártipli funkciyalar (Map / Transform) Másele: Massivtiń barlıq elementlerin kvadratqa kóteriw.
Imperativ stilde biz for ciklin jazamız. Funkcional stilde std::transform qollanamız.
Kod:
#include <iostream> #include <vector>
#include <algorithm> // transform using namespace std;
int main() {
vector<int> A = {1, 2, 3, 4, 5};
vector<int> B(A.size()); // Nátiyje ushın orın
// transform(baslanıw, tamamlanıw, nátiyje_bası, funkciya) transform(A.begin(), A.end(), B.begin(), [](int n) {
return n * n; // Taza funkciya
});
cout << "Kvadratlar: ";
for (int n : B) cout << n << " "; cout << endl;
return 0;
}
3-mısal: Filter (std::copy_if)
Másele: Massivten tek jup sanlardı tańlap alıw.
Kod:
#include <iostream> #include <vector>
#include <algorithm> // copy_if #include <iterator> // back_inserter using namespace std;
int main() {
vector<int> sanlar = {1, 5, 8, 9, 12, 4, 7}; vector<int> jup_sanlar;
// copy_if - shárt orınlansa ǵana kóshiredi
copy_if(sanlar.begin(), sanlar.end(), back_inserter(jup_sanlar), [](int n) {
return n % 2 == 0; // Predikat (shárt)
});
cout << "Jup sanlar: ";
for (int n : jup_sanlar) cout << n << " "; cout << endl;
return 0;
}
4-mısal: Reduce / Fold (std::accumulate)
Másele: Massiv elementleriniń qosındısın hám kóbeymesin esaplaw.
Kod:
#include <iostream> #include <vector>
#include <numeric> // accumulate using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// Qosındı (Baslanǵısh mánis 0)
int summa = accumulate(v.begin(), v.end(), 0);
// Kóbeyme (Baslanǵısh mánis 1, operaciya - kóbeytiw)
int kobeyme = accumulate(v.begin(), v.end(), 1, [](int a, int b) { return a * b;
});
cout << "Summa: " << summa << endl; cout << "Kóbeyme: " << kobeyme << endl;
return 0;
}
5-mısal: Funkciyanı qaytarıw (Closure)
Másele: "Kóbeytiwshi" funkciyasın generaciya etiw.
Kod:
#include <iostream>
#include <functional> // std::function using namespace std;
// Nátiyje retinde funkciya qaytaradı function<int(int)> makeMultiplier(int factor) {
// factor ózgeriwshisi lambda ishindegi "capture" arqalı saqlanıp qaladı return [factor](int n) {
return n * factor;
};
}
int main() {
auto ikige_kobeyt = makeMultiplier(2); auto ushke_kobeyt = makeMultiplier(3);
cout << "10 * 2 = " << ikige_kobeyt(10) << endl; cout << "10 * 3 = " << ushke_kobeyt(10) << endl;
return 0;
}
ÁMELIY TAPSÍRMALAR
1-tapsırma: Lambda sortlaw.
Student structurasın jaratıń (atı, bahası).
Studentler massivin jaratıp, olardı std::sort funkciyası hám lambda ańlatpası járdeminde bahası boyınsha kemeyiw tártibinde sortlań.
2-tapsırma: Filtrlew hám Transformaciya konveyeri.
Sanlar massivin alıń.
1.copy_if járdeminde tek oń sanlardı (>0) tańlap alıń.
2.transform járdeminde sol oń sanlardıń yarımın (n / 2.0) esaplań. Nátiyjeni ekranda shıǵarıń.
3-tapsırma: Qatarlardı qayta islew.
Tekstler (string) massivin jaratıń (mısalı: "alma", "Qawın", "anar").
transform hám lambda járdeminde barlıq tekstlerdi Bas háriplerge aylandırıń (toupper funkciyasın qollanıp).
4-tapsırma: Palindrom tekseriw (std::all_of).
Sannıń yamasa sózdiń palindrom ekenin (eki jaǵınan oqıǵanda birdey) tekseriwshi funkciya jazıń.
C++ algoritmlerinen std::equal yamasa std::mismatch qollanıp kóriń.
5-tapsırma: Rekursiv faktorial (Taza funkciya).
int factorial(int n) atlı taza funkciya jazıń.
Ol heshqanday global ózgeriwshini ózgertpewi hám ekranda jazıw shıǵarmay tek nátiyje qaytarıwı kerek. (Side effect bolmasın).
Main funkciyasında 5 sanınıń faktorialın esaplań.
