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

Joqari darejeli programmalastiriwda C++ Last

.pdf
Скачиваний:
9
Добавлен:
03.12.2023
Размер:
2.03 Mб
Скачать

keyingi ápiwayı san tabıladı. Aqırǵı ápiwayı sandı “eslep” qalıw ushın ápiwayı

ózgeriwshisi static etip anıqlanǵan.

Programma iske túskende klaviaturadan n ózgeriwshisiniń mánisi sıpatında 60 sanı kiritilse, ekranǵa tómendegı kóbeyme shıǵarıladı:

1*2*2*3*5

volatile klassı ózgeriwshileri. Eger programmada ózgeriwshini qaysıdur sırtqı qurılma yamasa basqa programma menen jalǵaw ushın isletiw zárúr bolatuǵın bolsa, ol volatile modifikatorı menen járiyalanadı. Kompiliyator bunday modifikatorlı ózgeriwshini registrge jaylastırıwǵa háreket qılmaydı. Bunday ózgeriwshiler járiyalanıwına mısal tómende keltirilgen:

volatile short port_1;

volatile const int Adress = 0x00A2;

Mısaldan kórinip turıptı, volatile modifikatorlı turaqlı da járiyalanıwı múmkin.

5.6. Atlar keńisligi

Bizge belgili, programmaǵa qosılǵan bet fayllarında járiyalanǵan identifikator hám turaqlılar kompilyator tárepinen jalǵız global atlar keńisligine kiritiledi. Eger programma kóp muǵdarda bet fayllardı isletse hám ondaǵı identifikatorlar hám turaqlılar atları túrli programma dúziwshiler tárepinen ǵárezsiz túrde anıqlanǵan bolsa, birdey atlardı isletiw menen baylanıslı mashqalalar júzege keliw itimallıǵı joqarı boladı. Atlar keńisligi túsiniginiń kiritiliwi usı mashqalanı belgili bir mániste sheshiwge járdem beredi. Eger programmada jańa identifikatordı anıqlaw kerek bolsa hám tap usı attı basqa modullerde yamasa kitapxanalarda isletiliw qáwpi bolatuǵin bolsa, bul identifikatorlar ushın óziniń jeke atlar keńisligin anıqlaw múmkin. Buǵan namespace gilt sózinen paydalanǵan halda erisiledi:

namespace <atlar keńisliginiń atı>

{

//járiylawlar

}

81

Atlar keńisligi ishinde járiyalanǵan identifikatorlar tek ǵana <atlar keńisliginiń atı> kóriniw aymaǵında boladı hám júzege keliwi múmkin bolǵan kelispewshiliklerdiń aldın aladı.

Mısal retinde tómendegi atlar keńisligin jaratayıq:

using namespace Jeke_atlar

{

int x, y, z;

void Meniń_funkciyam(char belgi);

}

Kompilyatorǵa konkret atlar fazasındaǵı atlardı isletiw kerekligin kórsetiw ushın kóriniw aymaǵına ruxsat beriw ámelinen paydalaniw múmkin:

Jeke_atlar::x=5;

Eger programma tekstinde konkret atlar keńisligine salıstırǵanda kóp múráját etiletuǵın bolsa using namespace qurılmasın isletiw arqalı jazıwdı ápiwayilastırıw múmkin:

using namespace <atlar keńisligi atı>;

Máselen using namespace Jeke_atlar; kórsetpesi kompilyatorǵa, bunnan

keyingi using ushıramaǵansha Jeke_atlar keńisligindegi atlar isletiliwi kerek ekenligin bildiredi:

x = 0; y = z = 10;

Meniń_funkciyam(‘A’);

Programma hám oǵan qosılǵan baslama faylları tárepinen anıqlanatuǵın atlar keńisligi std dep ataladı. Standart keńislikke ótiw kerek bolsa

using namespace std;

kórsetpesi beriledi.

Eger qandayda bir atlar fazasındaǵı óz aldına bir atqa múráját etiw zárúr bolsa, using qurılması basqa formada paydalanıladı. Mısal ushın:

using namespace std;

using namespace Jeke_atlar::x;

kórsetpesi x identifikatorın Jeke_atlar keńisliginen isletiw kerekligin bildiredi.

82

using namespace qurılmasi standart atlar keńisligi kóriniw aymaǵın jasıradı hám ondaǵı atqa múráját etiw ushın kóriniw aymaǵına ruxsat beriw ámelinen (std::) paydalanıw zárúr boladı.

Atlar keńisligi funkciya ishinde járiyalanıwı múmkin emes, biraq olar basqa atlar keńisligi ishinde járiyalanıwı múmkin. Ishpe-ish jaylasqan atlar keńisligindegi identifikatorǵa múráját etiw ushın onı qamtıp alǵan barlıq atlar keńisligi atlar izbe-iz túrde kórsetiliwi kerek. Mısal ushın, tómendegi kóriniste atlar keńisligi járiyalanǵan bolsın:

namespace Joqarı

{

namespace Orta

{

namespace Ishki(int Ishki_n;}

}

}

Ishki_n ózgeriwshisine múráját tómendegishe boladi:

Joqarı::Orta::Ishki::Ishki_n = 0;

Atlar keńisliginde funkciyanı járiyalawda atlar keńisliginde tek ǵana funkciya prototipin járiyalaw hám funkciya denesin basqa jerde járiyalaw durıs variant esaplanadı. Bul jaǵdaydıń kórinisine mısal:

namespace Atlar_keńisligi

{

char c; int i;

void Funkciya(char Bayraq);

}

void Atlar_keńisligi::Funkciya(char Bayraq)

{

//funkciya denesi

}

Ulıwma alǵanda, óz atına iye bolmagán atlar keńisligin járiyalaw múmkin.

Bul jaǵdayda namespace gilt sózinen keyin hesh nárse jazılmaydı. Mısal ushın:

83

namespace

{

char c_atsız;

int i_atsız;

}

kórinisindegi atlar keńisligi elementlerine múráját hesh bir prefix isletpesten ámelge asırıladı. Atsız atlar keńisligi tek gána ózi járiyalanǵan fayl shegarasında ámel qıladı.

C++ tili atlar keńisliginiń psevdonimlerin anıqlaw múmkinshiligin beredi. Bul jol arqalı atlar keńisligin basqa at penen isletiw múmkin boladı. Máselen, atlar fazası atı uzın bolǵanda oǵan qısqa at penen múráját etiw:

namespace Júdá_uzın_atlı_keńislik

{

float y;

}

Júda_uzın_atlı_keńislik :: = 0;

namespace Qısqa_at = Júda_uzın_atlı_keńislik;

Qisqa_at :: y = 13.2;

5.7. Jaylastırılatuǵın (inline) funkciyalar

Kompilyator islewi nátiyjesinde hár bir funkciya mashina kodı kórinisinde boladı. Eger programmada funkciyanı shaqırıw kórsetpesi bolsa, usı jerde funkciyanıń adresi boyınsha shaqırıwdıń mashina kodı payda boladı. Ádette funkciyanı shaqırıw processor tárepinen qosımsha waqıt hám yad resursların talap etedi. Sol sebepli, eger shaqırılatuǵın funkciya kólemi onsha úlken bolmaǵan jaǵdaylarda, kompilyatorǵa funkciyanı shaqırıw kodı ornına funkciya denesiniń ózin jaylastırıwǵa kórsetpe beriw múmkin. Bul jumıs funkciya prototipin inline gilt sózi menen járiyalaw arqalı ámelge asırıladı. Nátiyjede kólemi asqan, biraq salıstırmalı tez orınlanatuǵın programma kodı júzege keledi.

Funkciya kodı jaylastırılatuǵın programmaǵa mısal.

#include <iostream.h>

inline int Summa(int,int);

84

int main()

{

int a = 2, b = 6, c = 3; char jańa_qatar = ’\n’;

cout << Summa(a, b) << jańa_qatar; cout << Summa(a, c) << jańa_qatar; cout << Summa(b, c) << jańa_qatar; return 0;

}

int Summa(int x,int y)

{

return x + y;

}

Keltirilgen programma kodın jaratıwda Summa() funkciyası shaqırılǵan orınlarǵa onıń denesindegi buyrıqlar jaylastırıladı.

5.8. 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

hám sannıń pútin dárejesin esaplawdı kóriwimiz múmkin:

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

85

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 5.2 – súwrette kóriw múmkin:

F(4)=4*F(3)

F(4)=4*F(3)

F(4)=4*f(3)

F(4)=4*f(3)

F(4)=4*6

 

 

 

 

 

 

 

 

 

 

F(3)=3*F(2)

F(3)=3*F(2)

F(3)=3*F(2)

F(3)=3*2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

86

 

 

 

 

F(2)=2*F(1)

F(2)=2*F(1)

F(2)=2*1

 

 

 

 

 

 

 

 

F(1)=1*F(0)

F(1)=1*1

 

 

 

 

 

 

F(0)=1

 

 

 

 

 

 

 

 

5.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.

5.3-súwret. Xanoy minárası máselesin sheshiw processi

87

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

88

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ı.

5.9. 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)

89

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;

90