Добавил:
bekan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1-semestr / 7-LEKCIYA
.pdf
berilmegen bolsa, olardıń mánisi 0 esaplanadı. Global ózgeriwshiniń ámel qılıw
aymaǵı onıń kóriniw aymaǵı menen ústi-ústine tusedi (birdey).
Sonı aytıp ótiw kerek, tájiriybeli programma dúziwshiler múmkinshiligi
barınsha global ózgeriwshilerdi isletpewge háreket etedi, sebebi bunday
ózgeriwshiler mánisi programmanıń qálegen jerinen ózgertiw qáwpi barlıǵı sebepli
programma islewinde mazmunı tárepten qáteler júzege keliwi múmkin. Bul
pikirimizdi tastıyıqlaw ushın mısal kóreyik:
#include <iostream.h>
//global ózgeriwshi járiyalanıwı
int test = 100;
void Shıǵarıw(void);
int main()
{
//lokal ózgeriwshi járiyalanıwı
int test = 10;
//global ózgeriwshi shıǵarıw funkciyasın shaqırıw
Shıǵarıw();
cout << ‛Lokal ózgeriwshi: ‚ << test <<’\n’;
return 0;
}
void Shıǵarıw(void)
{
cout << ‛Global ózgeriwshi: ‚ << test <<’\n’;
}
Programma basında test global ózgeriwshisi 100 mánisi menen járiyalanadı.
Keyin, main() funkciyasında test atı menen lokal ózgeriwshisi 10 mánisi menen
járiyalanadı. Programmada Shıǵarıw() funkciyasına múráját etilgende, tiykarǵı
funkciya denesinen waqtınsha shıǵıladı hám natiyjede main() funkciyasında
járiyalanǵan barlıq lokal ózgeriwshilerge múráját etiw múmkin bolmay qaladı. Sol
sebepli, Shıǵarıw() funkciyasında global test ózgeriwshisiniń mánisi shıǵarıladı.
Tiykarǵi programmaǵa qaytılǵannan keyin, main() funkciyasındaǵı lokal test
ózgeriwshisi global test ózgeriwshisin «jasıradı» hám lokal test ózgeriwshiniń
mánisi shıǵarıladı. Programma islewi nátiyjesinde ekranǵa tómendegi nátiyjeler
shıǵarıladı:
Global ózgeriwshi: 100
Lokal ózgeriwshi: 10
:: ámeli.

Joqarıda belgilep ótilgenindey, lokal ózgeriwshi járiyalanıwı tap sonday
attaǵi global ózgeriwshini «jasırad» hám bul orınnan global ózgeriwshige múráját
etiw múmkinshiligi bolmay qaladı. C++ tilinde bunday jaǵdaylarda da global
ózgeriwshige múráját etiw múmkinshiligi saqlanıp qalınǵan. Bunıń ushın «kóriniw
aymaǵına ruxsat beriw» ámelinen paydalanıw múmkin hám ózgeriwshi aldına eki
noqat – «::» qoyıw kerek boladı. Mısal retinde tómendegi programmanı keltiremiz:
#include <iostream.h>
//global ózgeriwshi járiyalanıwı
int ózg = 5;
int main()
{
//lokal ózgeriwshi járiyalanıwı
int ózg = 70;
//lokal ózgeriwshini shıǵarıw
cout << ózg << ‘/n’;
//global ózgeriwshini shıǵarıw
cout << :: ózg << ’/n’;
return 0;
}
Programma islewi nátiyjesinde ekranǵa aldın 70 hám keyin 5 sanları shıǵadı.
Rekursiv funkciyalar
Joqarıda belgilep ótilgenindey rekursiya dep funkciya denesinde usı
funkciyanıń ózin shaqırıwǵa aytıladı. Rekursiya eki túrli boladı:
1. ápiwayı – eger funkciya óz denesinde ózin shaqırsa;
2. qurallı – eger birinshi funkciya ekinshi funkciyanı shaqırsa, ekinshisi
bolsa óz náwbetinde birinshi funkciyanı shaqırsa.
Ádette rekursiya matematikada keń qollanıladı. Sebebi kópshilik
matematikalıq formulalar rekursiv anıqlanadı. Misal ushın faktorialdı esaplaw
formulasın
Kórinip turǵanınday náwbettegi mánisti esaplaw ushın funkciyanıń “aldınǵı
mánisi” belgili bolıwı kerek. C++ tilinde rekursiya matematikadaǵı rekursiyaǵa
uqsas. Bunı joqarıdaǵı mısallar ushın dúzilgen funkciyalarda kóriw múmkin.

Faktorial ushın:
long F(int n)
{
if(!n)
return 1;
else
return n * F(n-1);
}
Berilgen haqıyqıy x sanınıń n-dárejesin esaplaw funkciyası:
double Pútin_Dáreje(double x, int n)
{
if(!n)
return 1;
else
return x * Pútin_Dáreje(x, n-1);
}
Eger factorial funkciyasına n > 0 mánis berilse, tómendegi jaǵday júz beredi:
shárt operatorınıń else shaqındaǵı mánisi (n mánisi) stekte eslep qalınadı. Házirshe
mánisi belgisiz n – 1 faktorialdı esaplaw ushın usı funkciyanıń ózi n – 1 mánisi
menen shaqırıladı. Óz náwbetinde, bul mánis te yadlap qalınadı (stekke
jaylastırıladı) hám jáne funkciya shaqırıladı h.t.b. Funkciya n = 0 mánis penen
shaqırılǵanda if operatorınıń shárti (!n) shın boladı hám “return 1;” ámeli orınlanıp,
tek usı shaqırıw boyınsha 1 mánisi qaytarıladı. Sonnan keyin “keri” process
baslanadı – stekte saqlanǵan mánisler izbe – iz alınadı hám kóbeytiledi: aqırǵı
mánis anıqlanǵannan keyin (1), ol onnan aldınǵı saqlanǵan mániske 1 mánisine
kóbeytip F(1) mánisi esaplanadı, bul mánis 2 mánisine kóbeytiw menen F(2)
tabıladı h.t.b. Process F(n) mánisin esaplawǵa shekem “kóbeytip” baradı. Bul
processti, n = 4 ushın factorial sxemasın 2 – súwrette kóriw múmkin:
2-súwret. 4! Esaplaw sxeması

Rekursiv funkciyalardıń tuwrı ámel etiwi ushın rekursiv shaqırıwlardıń
toqtaw shárti bolıwı kerek. Basqa jaǵdayda rekursiya toqtamawı hám óz
náwbetinde funkciya jumısı juwmaqlanbawı múmkin. Faktorial esaplawında
rekursiv túsiwlerdiń toqtaw shártinde funkciya parametri n = 0 bolıwı esaplanadı.
Hár bir rekursiv múráját qosımsha yad talap etedi – funkciyalardıń lokal
obyektleri (ózgeriwshileri) ushın hár bir múrájátta stekten jańadan orın ajıratıladı.
Máselen, rekursiv funkciyaǵa 100 mártebe múráját bolsa, jámi 100 lokal
obyektlerdiń kompleksi ushın orın ajıratıladı. Ayrım jaǵdaylarda, yaǵnıy
rekursiyalar sanı jeterli dárejede úlken bolǵanda, stek ólshemi sheklengenligi
sebepli ol tolıp ketiwi múmkin. Bul jaǵdayda programma óz jumısın “Stek tolıp
ketti” xabarı menen toqtatadı.
Tómende rekursiya menen qolaylı sheshiletuǵın “Xanoy minárası”
máselesin kóreyik.
Másele. Úsh A, B, C qazıq hám n dana hár túrli ólshemli dóńgelekler bar.
Dóńgelekkerdiń ólshemleri ósiw tártibinde 1 den n ge shekem
tártiplestirilgen. Basında barlıq dóńgelekler A qazıqqa 5.3a – súwrettegidey
jaylastırılǵan. A qazıqtaǵı barlıq dóńgeleklerdi B qazıqqa, járdemshi C qazıqtan
paydalanǵan halda, tómendegi qaǵıydalarǵa ámel qılǵan halda ótkeriw talap
etiledi: dóńgeleklerdi birewden kóshiriw kerek hám úlken ólshemli dóńgelekti
kishi ólshemli dóńgelek ústine qoyıw múmkin emes.
3-súwret. Xanoy minárası máselesin sheshiw processi
Kórsetpe: dóńgeleklerdi A dan B ǵa tuwrı ótkeriwde 5.3b – súwretlerdegi
jaǵday júzege keledi, jańa n dóńgelekti A dan B ǵa ótkeriw máselesi n-1
dóńgelekti A dan C ǵa ótkeriw hámde bir dóńgelekti A dan B ǵa ótkeriw
máselesine keledi. Onnan keyin C qazıqtaǵı n-1 dóńgelekti A qazıq járdeminde B
qazıqqa ótkeriw máselesi júzege keledi h.t.b.
#include <iostream.h>

void Hanoy(int n, char a = 'A', char b = 'B', char c = 'C')
{
if(n)
{
Hanoy(n-1, a, с, b);
cout<<‛Dóńgelek‛<<a<<‛dan‛<<b<<‛ǵa ótkerilsin\n‛;
Hanoy(n-1, c, b, a);
}
}
int main()
{
unsigned int Dóńgelekler_Sanı;
cout << ‛Hanoy minarası máselesi‛ << endl;
cout << ‛Dóńgelekler sanın kiritiń:‛;
cin >> Dóńgelekler_Sanı;
Hanoy(Dóńgelekler_Sanı);
return 0;
}
Dóńgelekler sanı 3 bolǵanda (Dóńgelekler_sanı = 3) programma ekranǵa
dóńgeleklerdi kóshiriw boyınsha ámeller izbe-izligin shıǵaradı:
Dóńgelek A dan B ǵa ótkerilsin
Dóńgelek A dan C ǵa ótkerilsin
Dóńgelek B dan C ǵa ótkerilsin
Dóńgelek A dan B ǵa ótkerilsin
Dóńgelek C dan A ǵa ótkerilsin
Dóńgelek C dan B ǵa ótkerilsin
Dóńgelek A dan B ǵa ótkerilsin
Rekursiya shıraylı, ıqsham kóringeni menen yadtı únemlew hám esaplaw
waqtın qısqartıw kóz-qarasınan onı ilajı barınsha iterativ esaplaw menen
almastırılǵanı maqul. Máselen, x haqıyqıy sanınıń n-dárejesin esaplawdıń
tómendegi sheshim variant salıstırmalı kem resurs talap qıladı (n-pútin belgisiz
san):
double Pútin_Dáreje(double x, int n)
{
double p = 1;
for(int i = 1; i <= n; i++)
p *= x;
return p;
}

Ekinshi tárepten, sonday máseleler bar bolıp, olardı sheshiwde rekursiya
júdá qolaylı, hátteki jalǵız usıl esaplanadı. Ásirese grammatikalıq analiz
máselelerinde rekursiya júdá qolay esaplanadı.
Qayta júkleniwshi funkciyalar
Ayrım algoritmler berilgenlerdiń hár túrli tiptegi mánisleri ushın qollanılıwı
múmkin. Máselen, eki sannıń maksimumın tabıw algoritminde bul sanlar pútin
yamasa haqıyqıy tipte bolıwı múmkin. Bunday jaǵdaylarda bul algoritmler ámelge
asırılǵan funkciyalar atları birdey bolǵanı maqul. Bir neshe funkciyaǵa birdey at
qoyıw, biraq hár túrli tiptegi parametrler menen isletiw funkciyanı qayta júklew
delinedi.
Kompilyator parametrler tipine hám sanına qarap sáykes funkciyanı
shaqıradı. Bunday ámeldi “sheshiw ámeli” delinedi hám onıń maqseti
parametrlerge bola tek tuwrı keletuǵın funkciyanı shaqırıw esaplanadı. Eger
bunday funkciya tabılmasa kompilyator qátelik haqqında xabar beredi. Funkciyanı
anıqlawda funkciya qaytarıwshı mánis tipiniń áhmiyeti joq. Mısal:
#include <iostream.h>
int max(int, int);
char max(char, char);
float max(float, float)
int max(int,int, int);
void main()
{
int a, int b, char c, char d, int k, float x, y;
cin >> a >> b >> k >> c >> d >> x >> y;
cout << max(a,b) << max(c,d) << max(a,b,k) << max(x,y);
}
int max(int i, int j)
{
return (i > j) ? i : j;
}
char max(char s1, char s2)
{
return (s1 > s2) ? s1 : s2;
}
float max(float x, float y)
{

return (x > y) ? x : y;
}
int max(int i, int j, int k)
{
return (i > j) ? (i > k ? i : k;) : ((j > k) ? j : k;);
}
Eger funkciya shaqırılıwında argument tipi onıń prototipindegi tap sol
orındaǵı parametr tipine sáykes kelmese, kompilyator onı parametr tipine
keltiriwge háreket etedi – bool hám char tiplerin int tipine, float tipin double tipine
hám int tipin double tipine ótkeriwge.
Qayta júkleniwshi funkciyalardan paydalanıwda tómendegi qaǵıydalarǵa
ámel qılıw kerek:
-qayta júkleniwshi funkciyalar bir kóriniw aymaǵında bolıwı kerek;
-qayta júkleniwshi funkciyalarda kelisim boyınsha parametrler isletilse,
bunday parametrler barlıq qayta júkleniwshi funkciyalarda da isletiliwi hám olar
birdey mániske iye bolıwı kerek;
- eger funkciyalar parametrleriniń tipi tek “const” hám “&” belgileri menen
parıqlanatuǵın bolsa, bul funkciyalar qayta júklenbeydi.
Соседние файлы в папке 1-semestr
